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