我不太确定如何表达问题,所以让我举一个例子来说明问题:
假设有一个将物品映射到类别的表格。每个物品可以有任意数量的类别,而每个类别当然可以容纳任意数量的物品。因此,您拥有一个如下所示的表格:
items_categories
id item_id category_id
问题是,我想选择具有特定类别ID的所有项目ID。例如,选择具有类别ID为1和2的所有item_id:我想找到与类别1和2都相关联的所有项目。显然,我不能使用AND语句,而OR语句将返回具有任一类别的所有item_id,但不一定同时具有两者。
这是我的解决方案和我能想到的最好的方法:选择所有category_id等于1或2的item_ids;在PHP中迭代结果并跟踪与category_id关联的item_ids的数量;然后取消设置结果中没有指定类别数量的item_ids。以下是我的代码片段:
很明显,如果您有许多不同的类别,那么您选择和处理的信息比理论上需要的要多得多。有什么想法吗?
谢谢!
编辑:这里是一个表格的例子和我想要的信息:
假设我想获取所有类别为1和2的物品。如果我只想要类别为1和2的物品,如何从我的示例表中获取物品#1?如果我选择具有类别1或2的所有内容(如上面的示例),在这种情况下,我必须选择整个表格并“手动”删除item_id为2和3,因为它们与类别1和类别2都没有关联。希望这能够稍微澄清一下。
最终编辑:尽管我似乎无法描述我正在尝试做什么,但我想出了解决方法。以下是我想出的查询语句,供记录:
在这种情况下,"(1, 2)"可以替换为"(category_id1, category_id2, …)",末尾的"2"将被替换为我要搜索的类别数。因此,它会查找符合每个项目条件的类别数量,由于我只想选择所有类别都匹配的项目,所以它只选择类别数等于我要查找的类别数的那些项目。当然,这是假设没有重复的类别或其他类似情况。感谢您的回复!
假设有一个将物品映射到类别的表格。每个物品可以有任意数量的类别,而每个类别当然可以容纳任意数量的物品。因此,您拥有一个如下所示的表格:
items_categories
id item_id category_id
问题是,我想选择具有特定类别ID的所有项目ID。例如,选择具有类别ID为1和2的所有item_id:我想找到与类别1和2都相关联的所有项目。显然,我不能使用AND语句,而OR语句将返回具有任一类别的所有item_id,但不一定同时具有两者。
这是我的解决方案和我能想到的最好的方法:选择所有category_id等于1或2的item_ids;在PHP中迭代结果并跟踪与category_id关联的item_ids的数量;然后取消设置结果中没有指定类别数量的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和2的物品,如何从我的示例表中获取物品#1?如果我选择具有类别1或2的所有内容(如上面的示例),在这种情况下,我必须选择整个表格并“手动”删除item_id为2和3,因为它们与类别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"将被替换为我要搜索的类别数。因此,它会查找符合每个项目条件的类别数量,由于我只想选择所有类别都匹配的项目,所以它只选择类别数等于我要查找的类别数的那些项目。当然,这是假设没有重复的类别或其他类似情况。感谢您的回复!