Поиск идентификатора, имеющего все значения (mySQL, SQL) - PullRequest
5 голосов
/ 10 августа 2009

Подумайте о такой таблице

ID     Value    
100    1    
100    3    
101    1    
101    4    
102    2    
102    5    
103    2    
103    4    
104    1    
104    3    
105    2    
105    5

Проблема в том, что если я задаю значения 2 и 5, я получу 102 и 105, которые и 102, и 105 имеют значения 2 и 5 одновременно, или если я дам значения 1 и 3, я получу 100 и 104.

Как я могу сделать это только с одной командой sql? Мне нужен максимально легкий запрос.

и с использованием UNION, INTERSECTION или NESTED SQL, который быстрее, медленнее и тяжелее e.t.c?

Заранее спасибо Ergec

Ответы [ 3 ]

6 голосов
/ 10 августа 2009

Попробуйте что-то вроде этого:

SELECT id
  FROM test
WHERE 
   value in (2,5)
GROUP by id
HAVING count(*) = 2

Если вы хотите проверить это, просто таблица для него (без индексов!):

CREATE TABLE IF NOT EXISTS test (
  id int(4) NOT NULL,
  `value` int(4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO test (id, value) VALUES
(100, 1),
(100, 3),
(101, 1),
(101, 4),
(102, 2),
(102, 5),
(103, 2),
(103, 4),
(104, 1),
(104, 3),
(105, 2),
(105, 5);

У меня был очень похожий вопрос несколько дней назад. см. MySQL - Найти строки, соответствующие всем строкам из объединенной таблицы

0 голосов
/ 10 августа 2009

Есть много решений. В дополнение к решению Jhonny, вы можете использовать соединение

SELECT DISTINCT t1.id
FROM table t1, table t2
WHERE t1.id = t2.id
  AND t1.value = 2
  AND t2.value = 5

ИЛИ использовать Intersect

SELECT id FROM table WHERE value = 2

INTERSECT

SELECT id FROM table WHERE value = 5
0 голосов
/ 10 августа 2009

Это был бы мой способ достичь этого:

SELECT DISTINCT id
FROM table 
WHERE 
id IN (SELECT id FROM table WHERE value = 2)
AND 
id IN (SELECT id FROM table WHERE value = 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...