Я пытаюсь сделать что-то вроде PHP array_intersect
. У меня есть следующая таблица
CREATE TABLE `recipes_ingredients_items` ( `id` INTEGER(11) DEFAULT NULL, `itemid` INTEGER(11) DEFAULT NULL, `orderby` TINYINT(4) NOT NULL, KEY `id` (`id`), KEY `itemid` (`itemid`) )ENGINE=MyISAM AVG_ROW_LENGTH=47 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
Мне нужен запрос, который даст мне все результаты, которые содержат say id 2,72,64 в качестве отдельного элемента. Дело в том, что идентификатор может существовать более одного раза в itemid, то есть itemid 600 может иметь 3 строки с идентификаторами 2100,2, связанных с ним.
Моя идея заключалась в том, чтобы иметь запрос с array_intersect
числа x подзапросов, возвращающих результаты, и делать что-то вроде PHP array_intersect
, возвращая тем самым элементы, у которых есть все эти идентификаторы.
SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id IN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 71) AND id IN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 2) AND id IN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 22)
Это то, что я получил, и это на 100% неправильно.
Обычно вы выполняете пересечение элементов списка каждого идентификатора :
(SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 71) INTERSECT (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 2) INTERSECT (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 22)
Это будет выбирать только те элементы, где есть идентификатор для всех трех идентификаторов .
Но поскольку MySQL не поддерживает INTERSECT
, вам необходимо использовать внутренние соединения:
SELECT DISTINCT itemid FROM recipes_ingredients_items INNER JOIN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 71) a USING (itemid) INNER JOIN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 2) b USING (itemid) INNER JOIN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 22) c USING (itemid)
Попробуй это:
SELECT item_id FROM recipes_ingredients_items WHERE id IN (71, 2, 22) GROUP BY item_id HAVING COUNT(*) = 3