选择连接表中的项目,其中每个链接需要满足多组条件

时间:2014-02-14 11:00:36

标签: php mysql sql jointable

我有一个结构设置,其中条件可以有多个值(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中的每个条件,但我更喜欢它是否可以在查询中完成。

1 个答案:

答案 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;

如果您的要求是其他原因,请让我理解。