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

Posted

技术标签:

【中文标题】在连接表中选择每个链接需要满足多组条件的项目【英文标题】:Select item in join table where multiple sets of conditions need to be met for each link 【发布时间】:2014-02-14 11:00:36 【问题描述】:

我有一个结构设置,其中条件可以有多个值(OR 子句)并且必须满足所有条件(AND 子句),条件的数量是动态的,并且可以随着每次查询而增加或减少。

我想对 ItemsCondition_Values (items_values) 的连接表执行查找,其中 Item 满足所有条件。链接本身是从 ItemsCondition_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 【参考方案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;

如果您有其他要求,请让我理解。

【讨论】:

最好是通过查询返回项目 ID 列表的解决方案。要选择的项目的条件是它至少包含每组值中的 1 个 condition_value_id。在上面的模式中,这意味着将返回项目 1 和 3,但不会返回 2,因为它在每个组中没有一个匹配项 这里的group是指这三个数组(1,5,10,22,33),(5,9,55),(9,15,22)吗?? 是的,在这种情况下,会有三个 condition_value_ids 数组 - 一个 Item 需要每个数组至少有一行具有 condition_value_id 嘿..不是 2 即 (5,9,55) 在两个数组中都有匹配项吗? 对不起@Neels,我帖子中提到的条件是 (1, 5, 6, 9), (2, 10 , 15), (9, 22, 33)。在你提到的情况下,是的。

以上是关于在连接表中选择每个链接需要满足多组条件的项目的主要内容,如果未能解决你的问题,请参考以下文章

满足两个条件的两个表中的相同列名

sql中的inner join ,left join ,right join

为每个 ID 选择 MAX DATE

MySQL查询基于AND选择链接表中的项目

当条件不满足时,while循环退出而不是循环

选择满足在存储过程中计算的条件的行