За последние 24 часа нас посетили 15732 программиста и 1666 роботов. Сейчас ищут 815 программистов ...

тесты. объединить несколько штук

Тема в разделе "PHP и базы данных", создана пользователем likser, 3 янв 2016.

  1. likser

    likser Активный пользователь

    С нами с:
    5 апр 2009
    Сообщения:
    8
    Симпатии:
    0
    всем привет. делаю тесты по истории, химии, физике. есть таблица с темами (theme) (темы соответственно история, физика, химия) и таблица с вопросами (quest). нужно сделать чтобы в одном тесте были вопросы по химии и физике. не могу придумать как это реализовать.
    в таблице с темами такие столбцы: id, name
    в таблице с вопросами следующее: id, theme (id темы), quest, answer

    мои мысли такие: добавляем в таблице с темами колонку unity (например) и туда записываем темы которые входят в этот тест: 2 (химия) и 3 (физика), а вот как сделать нормальный запрос, чтобы из таблицы с вопросами вытащить нужные по заданным темам, не знаю. да, знаю про вариант
    Код (PHP):
    1. SELECT * FROM quest WHERE theme=2 AND theme=3
    но если у меня тем штук 100? и надо сделать 20 объединенных тестов, каждый из которых содержит по 10 тем? к каждому писать свой запрос как то не очень. может я неправильно мыслю.. подскажите как реализовать

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    это бывает с новичками, не чувствуют где следует писать И, а где ИЛИ.
    запомни: одно поле не может быть одновременно равно двум разным значениям! так что не вариант :)

    Добавлено спустя 1 минуту 26 секунд:
    а вариант когда "сотня ИЛИ" оформляется как
    Код (PHP):
    1. … WHERE x IN(1, 2, 20, 123, 12) 
     
  3. likser

    likser Активный пользователь

    С нами с:
    5 апр 2009
    Сообщения:
    8
    Симпатии:
    0
    да, в этом ты прав. проглядел

    говорят IN жутко тормозит в таких случаях. в принципе я буду рад, если хотя бы таким способом все будет работать, но все же хотелось бы, чтобы было более профессионально что ли
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    еще есть вариант UNION либо UNION ALL. в некоторых случаях он дает выигрышь в скорости.
    Код (PHP):
    1. SELECT a,b,c FROM t WHERE x=2
    2.   UNION ALL
    3. SELECT a,b,c FROM t WHERE x=3
    разница между UNION и UNION ALL в том, что в первом случае объединяемые строки сравниваются между собой (значения всех полей) чтобы выкинуть дубли. если ты и так уверен, что дублей не будет или они тебе не мешают, то ставь UNION ALL.
     
  5. likser

    likser Активный пользователь

    С нами с:
    5 апр 2009
    Сообщения:
    8
    Симпатии:
    0
    благодарю. почитаю, попробую, отпишусь
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    врут. или цитируй не только утверждение, но и контекст в котором оно делалось. если у тебя 100 строк в таблице, можно хоть декартово произведение заипенить, тормозить не будет.

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