ФорумРазработкаБазы данных → Вытащить рендомом из базы

Вытащить рендомом из базы

  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 21 апреля 2008 г. 10:56

    Введение :
    Делаю тест на пхп. Есть две таблицы tbl_questions и tbl_answers.
    tbl_questions имеет структуру :
    | ID | question |

    tbl_answers имеет структуру :
    | ID | question_id | answer | is_correct |

    т.е. у каждого вопроса может быть сколько угодно вариантов ответов, но истинный только один.

    Задача :
    Вытащить рендомные ответы. т.е. вытащить один ответ тот который является правильный и вытащить рендомом два неправильных.

    Мое решение :
    SELECT * FROM `tbl_answers` WHERE `question_id` = '3' AND `is_correct` = '1' UNION SELECT * FROM `tbl_answers` WHERE `question_id` = '3' ORDER BY RAND() LIMIT 3


    но к сожалению, рендомом вытягивается все 3 ответа, т.е. не всегда вытягивается истинный ответ ( тот у которого is_correct == 1 ).

    Подскажите что я делаю не так…

    как вариант я думал разбить все ето дело на два запроса…
    в 1-ом вытаскивать только правильный ответ, а во 2-ом вытягивать рендомом 2 неправильных….
    но я просто хочу разобратся почему не проходит первый запрос…

    заранее благодарен
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 21 апреля 2008 г. 11:27, спустя 30 минут 16 секунд

    SELECT * FROM tbl_answers WHERE question_id=3 ORDER BY is_correct DESC, RAND() LIMIT 3

    Потом сделать рандомный порядок с помощью php shuffle
  • ghost

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 21 апреля 2008 г. 11:30, спустя 3 минуты 37 секунд

    NRG, странно, должен работать с юнионом.., хотя с сортировкой лучше :)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 9:01, спустя 21 час 30 минут 53 секунды

    AlexB, спасибо за совет, но я все же искал возможность как это сделать только запросом….

    все же я решил эту задачу, решение меня поразило…. =)

    (SELECT * FROM `tbl_answers` WHERE `question_id` = '3' AND `is_correct` = '1' LIMIT 1)
    UNION
    (SELECT * FROM `tbl_answers` WHERE `question_id` = '3' AND `is_correct` != '1' ORDER BY RAND() LIMIT 2) ORDER BY RAND()


    всем спасибо за ответы.
  • ghost

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 22 апреля 2008 г. 10:13, спустя 1 час 12 минут 22 секунды

    имхо, в даном случае решение одним запросом не оптимально
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 11:24, спустя 1 час 10 минут 40 секунд

    имхо, в даном случае решение одним запросом не оптимально


    аргументируйте.
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 11:35, спустя 10 минут 37 секунд


    аргументируйте.
    В 99% случаев узкое место веб-приложения - БД. Хотя в данном вопросе все это не столь существенно … можно и так и так.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 11:53, спустя 18 минут 13 секунд

    ну лично я всегда считал, что от БД нужно брать все по максимуму….

    к примеру, считать кол-во строк в таблице ф-ей COUNT а не средствами пхп….

    разве я не прав ?
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 12:14, спустя 20 минут 45 секунд


    к примеру, считать кол-во строк в таблице ф-ей COUNT а не средствами пхп….
    не корректный пример, запрос к базе будет в любом случае, как не считай.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 12:17, спустя 3 минуты 14 секунд

    не корректный пример, запрос к базе будет в любом случае, как не считай.

    а в случае вытягивания ответов из базы запроса не будет чтоли ?
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 22 апреля 2008 г. 12:20, спустя 2 минуты 46 секунд

    один запрос, вместо фактически двух объединенных UNION

    Хотя я уже сказал, в данном случае это все не существенно. Сделал с юнионом - ну и отлично, нет повода морочиться.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!