【问题标题】:MySQL DISTINCT function not working as I expectedMySQL DISTINCT 函数未按预期工作
【发布时间】:2014-03-21 13:02:08
【问题描述】:

注意:我对 MySQL 还很陌生,所以请多多包涵。

我的数据库中有 2 个表,设置如下:

guides table:
guide_id (primary) | cat_id | title
   1                   0     guide01
   2                   0     guide02

steps table:
step_id | guide_id (foreign) | step_txt
   1              1            step1 text...
   2              1            step2 text...

我正在尝试在数据库中搜索 steps.step_txt 中的关键字并返回指南列表。我当前的查询如下所示:

SELECT DISTINCT * 
  FROM guides 
    JOIN steps ON guides.guide_id=steps.guide_id 
  WHERE step_txt LIKE "%keyword%"

我发现,由于某些指南包含多个关键字,因此会返回重复的行。我希望查询输出包含 guide_id、cat_id 和标题的 1 行,即使它找到 2。

我认为问题在于我使用了 JOIN,因此查询实际上是从两个表中返回一个连接行,这两个表将具有不同的 step_id 和 step_txt,因此 DISTINCT 不会影响它。最好的解决方法是什么?

【问题讨论】:

    标签: mysql sql join distinct


    【解决方案1】:

    粗略的解决方案是:-

    SELECT DISTINCT guides.* 
      FROM guides 
        JOIN steps ON guides.guide_id=steps.guide_id 
      WHERE step_txt LIKE "%keyword%"
    

    可能更优雅,并为您提供匹配的文本:-

    SELECT g.guide_id, g.cat_id, g.title, GROUP_CONCAT(s.step_txt)
    FROM guides g
    INNER JOIN steps s
    ON g.guide_id = s.guide_id 
    WHERE step_txt LIKE "%keyword%"
    GROUP BY g.guide_id, g.cat_id, g.title
    

    【讨论】:

      【解决方案2】:

      distinct * 将返回 all 列不同的行。对于你想要的,你可以使用:

      SELECT *
      FROM guides JOIN
           steps
           ON guides.guide_id = steps.guide_id 
      WHERE step_txt LIKE "%keyword%"
      GROUP BY guides.guide_id;
      

      这使用了group by 的 MySQL 扩展,它在其他数据库中不起作用。从steps 返回的列来自任意匹配的行。

      【讨论】:

        【解决方案3】:

        简单的解决方案是:

        SELECT DISTINCT guides.*
        FROM guides, steps
        WHERE step_txt LIKE "%keyword%" 
        AND guides.guide_id=steps.guide_id
        

        【讨论】:

          【解决方案4】:

          你也可以使用 IN 运算符

          select guide_id from guides where guide_id IN (select guide_id from steps where step_txt LIKE "%keyword%")
          

          【讨论】:

            猜你喜欢
            • 2018-02-01
            • 1970-01-01
            • 2019-10-30
            • 2015-04-11
            • 2022-01-25
            • 2019-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多