Функция MySQL 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%"

Я обнаружил, что, поскольку в некоторых руководствах содержится более одного шага с ключевым словом, это возвращает дублированные строки. Я хотел бы, чтобы запрос вывел 1 строку, содержащую guide_id, cat_id и title, даже если он найдет 2.

Я думаю, проблема в том, что я использовал JOIN, поэтому запрос на самом деле возвращает объединенную строку из обеих таблиц, которые имели бы разные step_id и step_txt, так что DISTINCT не влияет на это. Какой лучший обходной путь для этого?

4 ответа

Решение

Грубое решение будет:

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

distinct * собирается вернуть строки, где все столбцы различны. Для чего вы хотите, вы можете использовать:

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

Это использует расширение MySQL для group by и это не будет работать в других базах данных. Столбцы вернулись из steps происходит из произвольных совпадающих строк.

Простое решение:

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

Вы также можете использовать оператор IN

select guide_id from guides where guide_id IN (select guide_id from steps where step_txt LIKE "%keyword%")
Другие вопросы по тегам