MySQL DISTINCT函数无法正常工作

时间:2014-02-20 14:11:18

标签: mysql sql join distinct

注意:我对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和title的1行,即使它找到2。

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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返回的列来自任意匹配的行。

答案 2 :(得分:0)

简单的解决方案是:

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

答案 3 :(得分:0)

您也可以使用IN运算符

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