【问题标题】:MySQL Select Matching Rows With Same Value From 2 Different ItemsMySQL 从 2 个不同的项目中选择具有相同值的匹配行
【发布时间】:2018-05-21 01:44:27
【问题描述】:

我有一个包含 3 列(主键、Col1、Col2)的表。 Col1 上有一个索引。该表超过 1 亿行,因此我想使用索引进行查询以提高速度。

我试图从 Col1 中搜索 2 个在 Col2 中具有匹配值的项目,但不包括仅匹配其中 1 个项目的任何结果。

Col1  | Col2
------------
item1 | 123
item2 | 492
item3 | 123
item4 | 392
item5 | 588
item1 | 456
item2 | 492
item3 | 039
item4 | 938
item5 | 209
item1 | 456

例如这个查询:

SELECT * FROM `table` WHERE `Col1` = 'item1' OR `Col1` = 'item3' group 
by Col2
having count(*) > 1

返回:

item1 | 123
item1 | 456

item1 | 123 是正确的,因为它像我想要的那样匹配 item1 和 item3,但我不希望它返回 item1 | 456,因为它不匹配 item1 和 item3。它只是返回,因为有 2 个 item1 与之匹配。任何帮助将不胜感激。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用count(distinct):

    SELECT Col2
    FROM `table`
    WHERE Col1 IN ('item1', 'item3') 
    GROUP BY Col2
    HAVING COUNT(DISTINCT Col1) > 1;
    

    【讨论】:

      【解决方案2】:

      改用COUNT(DISTINCT)

      SELECT t1.*
      FROM yourTable t1
      INNER JOIN
      (
          SELECT Col2
          FROM yourTable
          GROUP BY Col2
          -- WHERE Col1 IN ('item1', 'item3')
          HAVING COUNT(DISTINCT Col1) = 2
      ) t2
          ON t1.Col2 = t2.Col2;
      

      请注意,如果要返回完整的匹配记录,则需要将原始查询连接回主表。我也不会假设您想要哪些匹配,而是返回所有匹配对。

      Demo

      【讨论】:

      • 如何以这种方式专门搜索 item1 和 item3?该表是数百万行。我可能是错的,但我假设这将返回与我正在搜索的 2 个项目不匹配的所有内容。
      • @Dan 您可以在子查询中添加WHERE 子句。我试图给出一个一般性的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多