Я не совсем уверен, как сформулировать вопрос, поэтому позвольте мне просто привести пример проблемы:
Предположим, есть таблица, в которой элементы сопоставляются с категориями. Каждый элемент может иметь любое количество категорий, и каждая категория, конечно, может содержать любое количество элементов. Итак, у вас есть таблица, которая выглядит так:
items_categories
id item_id category_id
Проблема в том, что я хочу выбрать все идентификаторы элементов, которые имеют идентификаторы определенной категории. Например, выберите все item_id с category_id равным 1 и 2: я хочу найти все элементы, которые связаны с категориями 1 и 2. Очевидно, что я не могу использовать оператор AND, и оператор OR вернет все item_id с любой категорией. , но не обязательно и то, и другое.
Вот мое решение и лучшее, что я могу придумать: выберите все item_ids с category_id равным 1 OR 2; перебирать результаты в PHP и отслеживать, сколько item_ids связано с category_id; а затем отключите все item_ids в результатах, которые не имеют указанного количества категорий. Вот фрагмент моего кода:
// assume $results is an array of rows from the db
// query: SELECT * FROM items_categories WHERE category_id = 1 OR category_id = 2;
$out = array();
foreach ($results as $result)
{
if (isset($out[$result['item_id']]))
$out[$result['item_id']] ++;
else
$out[$result['item_id']] = 1;
}
foreach ($out as $key=>$value)
{
if ($value != 2)
unset($out($key));
}
return array_keys($out); // returns array of item_ids
Очевидно, что если у вас много разных категорий, вы выбираете и обрабатываете гораздо больше информации, чем теоретически необходимо. Любые идеи?
Спасибо!
Изменить: Вот пример таблицы и информация, которую я хочу от нее:
id item_id category_id
1 1 1
2 1 2
3 2 1
4 3 2
Скажем, я заинтересован в получении всех элементов с категориями 1 и 2. Как мне получить элемент № 1 из моей примерной таблицы, учитывая, что мне нужны только элементы с категориями № 1 и № 2 ? Если я выберу все с категориями 1 или 2 (как в моем примере выше), мне придется выбрать всю таблицу в этом случае и «вручную» удалить значения 2 и 3 item_id, поскольку они не связаны как с категорией 1, так и с категорией 2. Надеюсь, это поможет немного прояснить ситуацию.
Последнее изменение. Я понял это, несмотря на очевидную неспособность описать то, что я пытаюсь сделать, хех. Вот вопрос, который я придумал для записи:
SELECT *
FROM
(
SELECT item_id, COUNT(*) as count
FROM items_categories
WHERE category_id IN (1, 2)
GROUP BY item_id
) table_count
WHERE count = 2;
В этом случае "(1, 2)" можно заменить на "(category_id1, category_id2, ...)" и "2" в конце будет заменено количеством категорий, которые я ищу.
Таким образом, он определяет, сколько категорий соответствуют критериям для каждого элемента, и, поскольку мне нужны только те элементы, в которых совпадают ВСЕ категории, он выбирает только те, количество категорий которых равно количеству категорий, которые я ищу. Это, конечно, при условии, что нет повторяющихся категорий или чего-то подобного.
Спасибо за ответы!