gpt4 book ai didi

PHP/MySQL : Many-to-many/intersect table question

转载 作者:可可西里 更新时间:2023-11-01 08:55:45 24 4
gpt4 key购买 nike

我不太确定如何表述这个问题,所以让我举一个问题的例子:

假设有一个将项目映射到类别的表。每个项目可以有任意数量的类别,每个类别当然可以包含任意数量的项目。所以你有一个看起来像这样的表:

项目类别

id item_id category_id

问题是,我想选择所有具有特定类别 ID 的项目 ID。例如,选择 category_id 为 1 和 2 的所有 item_id:我想查找与类别 1 和 2 相关的所有项目。显然我不能使用 AND 语句,而 OR 语句将返回所有 item_id 的任一类别,但不一定两者兼而有之。

这是我的解决方案,也是我能想到的最好的办法:选择所有 category_id 等于 1 或 2 的 item_id;在 PHP 中遍历结果并跟踪有多少 item_ids 与 category_id 相关联;然后取消设置结果中没有指定数量类别的所有 item_id。这是我的代码片段:

// 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 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”最后将替换为我正在搜索的类别数。

因此它会找出有多少类别与每个项目的条件相匹配,并且由于我只想要所有类别都匹配的项目,因此它只会选择类别数等于我要查找的类别数的项目。这当然是假设没有重复的类别或类似的东西。

感谢您的回复!

最佳答案

似乎让您感到困扰的是您被迫进行线性搜索,这当然需要 O(n) 时间,但是如果您按排序顺序从数据库中选择元素,那么您不能只使用一个时间复杂度为 O(lg n) 的二分查找?

我希望这对您有所帮助,如果没有,那么我可能误解了您的问题,我希望您稍微澄清一下。

关于PHP/MySQL : Many-to-many/intersect table question,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4871725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com