Приветствую. Есть таблица с 2 столбцами id1 и id2. Код (Text): id1 id2 1 1 1 1 2 1 2 2 3 2 3 2 4 1 4 1 5 1 5 2 Задача выбрать из нее такие значения первого столбца, чтобы значения во втором содержали одновременно несколько заданных значений. Например, мы выбираем такие значения первого, чтобы второй столбец содержал одновременно 1 и 2. Результатом будут 2 и 5, так как остальные содержат либо только 1, либо только 2, а нам нужно чтобы одновременно. На ум приходит следующий вариант. [sql]SELECT `id1` FROM table WHERE `id1` IN (SELECT `id1` FROM table WHERE `id2` = 1) and `id1` IN (SELECT `id1` FROM table WHERE `id2` = 2)[/sql] Но если значений будет 10 или 20, то получится 20 вложенных селектов. Можно ли как-то упростить? В идеале, конечно, получить одним запросом, но впринципе я не против того, чтобы разбить на несколько или обработать результат в цикле на php.
Конечно не выполнится - я же говорил, что совру Если разновидностей значений во втором столбце немного, то можно так: SELECT `id1`, GROUP_CONCAT(DISTINCT id2 order by id2 asc) list FROM table WHERE id2 in(1, 2) group by id1 having list = '1,2' или так, если список не нужен: SELECT `id1` FROM table WHERE id2 in(1, 2) group by id1 having GROUP_CONCAT(DISTINCT id2 order by id2 asc) = '1,2'
Вариант с count(): SELECT `id1` FROM table WHERE id2 in(1, 2) group by id1 having count(DISTINCT id2) = 2
Спасибо за варианты. Данных в таблице довольно много и разновидностей около 100 разных цифр. Одновременно обычно запрашивается от 2 до 10. Потестировал, даже если выбирать с 2 значениями, то запрос занимал около 10 секунд. А такие показатели на живом сайте, безусловно, неприемлимы. А вот вариант с count() не попробовал, так как не совсем понял как его применять, если нужно выбрать не по двум id2, а, к примеру по трем.
Сделайте индексы правильные и будет Вам счастье. SELECT `id1` FROM table WHERE id2 in(1,2,3) group by id1 having count(DISTINCT id2) = 3
Там же всего 2 столбца и оба индексные, так как связаны foreign key с другими таблицами. Или можно как-то хитрее сделать? Я правильно понимаю, что оно будет работать только в том случае, если во втором столбце содержатся только те значения по которым происходит выборка и никакие другие? К примеру если в id2 содержатся значения 1 2 3 4 5, а я выбираю по комбинации 2 3 5, то в выборку попадут не только 2 3 5, а любая уникальная тройка.
10 000 Спасибо, попробую отпишусь =) я вроде бы понял в чем тут фишка и оно и вправду будет работать как надо
Десять тысяч это ничто для БД - должно выполняться за тысячные, максимум сотые доли секунды даже без ключей. Ищите проблему в другом месте.