【发布时间】:2014-02-14 11:00:36
【问题描述】:
我有一个结构设置,其中条件可以有多个值(OR 子句)并且必须满足所有条件(AND 子句),条件的数量是动态的,并且可以随着每次查询而增加或减少。
我想对 Items 和 Condition_Values (items_values) 的连接表执行查找,其中 Item 满足所有条件。链接本身是从 Items 到 Condition_Value,我正在预先格式化 SQL 以将 condition_value_ids 分组到适当的子句组中,如下所示:
(1 OR 5 OR 6 OR 9), (2 OR 10 OR 15), (9 OR 22 OR 33)
在某个时候被“与”在一起。
我正在寻找一种进行 SQL 查询的方法,该查询选择一个独特的 Item_Id,其中所有条件都满足,并且链接到每个条件中的至少一个 condition_value_ids组。
所以像这样的表:
ITEM_ID CONDITION_VALUE_ID
1 1
1 5
1 10
1 22
1 33
2 5
2 9
2 55
3 9
3 15
3 22
会返回 ID 为 1 和 3 的 ItemS(因为项目 1/3 在每个条件组中至少匹配 1 个 condition_value_id 链接,所以 2 在每个组中都没有至少 1 个匹配项)。我最好的猜测是内部语句的巨大混乱进行检查,例如
SELECT * FROM items_values
WHERE EXISTS(
SELECT TOP 1 1 FROM items_values WHERE condition_value_id IN (1, 5, 6, 9))
) AND
.....
或者,我可以使用 item_id 获取一个 condition_value_ids GROUP BY 的平面列表,然后在 PHP 中手动进行搜索,但是收集每个项目、每次搜索似乎都太过分了。
任何正确方向的建议将不胜感激。
编辑
类似这样的东西(他们在下面的修改版本):
SELECT ITEM_ID,GROUP_CONCAT(CONDITION_VALUE_ID) AS VALUE_IDS, COUNT(CONDITION_VALUE_ID) FROM TEST
GROUP BY ITEM_ID
HAVING COUNT(CONDITION_VALUE_ID) > 1;
然后对每个 VALUE_IDS 执行 LIKE 是可能的,或者只是执行 in_array 检查以匹配 PHP 中的每个条件,但我希望它可以在查询中完成。
【问题讨论】:
-
它是 MySQL 还是 SQLServer?
-
@OGHaza 抱歉没有意识到它同时标记了两者,它是 MySQL