注意:我对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不会影响它。最好的解决办法是什么?
答案 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%")