我有一个结构设置,其中条件可以有多个值(OR claused)并且必须满足所有条件(AND子句),条件的数量是动态的,并且可以随每个查询增加或减少。
我想在项和 Condition_Values (items_values)的连接表上执行查找,其中项符合所有条件。链接本身是从项到 Condition_Value ,我正在预先格式化SQL以将condition_value_ids分组到正确的claused组中,如下所示:
(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中的每个条件,但我更喜欢它是否可以在查询中完成。
答案 0 :(得分:1)
查看此SQL Fiddle。
您是否正在寻找查询或其他内容提供的解决方案。
我的查询是:
SELECT ITEM_ID,
CONDITION_VALUE_ID,
GROUP_CONCAT(ITEM_ID) AS COMMON_ITEM_ID,
COUNT(CONDITION_VALUE_ID)
FROM ITEMS_VALUES
GROUP BY CONDITION_VALUE_ID
HAVING COUNT(CONDITION_VALUE_ID) > 1;
如果您的要求是其他原因,请让我理解。