В MySQL: выбор публикаций по ключевым словам, но с учетом всех ключевых слов в результатах - PullRequest
0 голосов
/ 11 мая 2018

Таблица публикаций выглядит так:

publications
============
id title etc ...

Таблица ключевых слов выглядит следующим образом:

keywords
========
id name etc ...

Таблица Keywords_relations создает отношения между публикациями и ключевыми словами в виде внешних ключей, где pid указывает на публикации публикации.ид, а ребенок указывает на ключевые слова.ид.

keyword_relations
=================
pid kid

В MySQL я построил следующий запрос:

SELECT publications.*,
        GROUP_CONCAT(keywords.name SEPARATOR ', ') AS keywords
        FROM publications
        LEFT JOIN  keyword_relations
        INNER JOIN keywords
        ON keyword_relations.kid = keywords.id
        ON keyword_relations.pid = publications.id
        WHERE keywords.id = 1
        GROUP BY publications.id
        ORDER BY publications.date DESC;

Я выбираю публикации на keyword.id. Однако в списке результатов столбец «ключевые слова» возвращает только выбранное ключевое слово. Я хотел бы, чтобы столбец "ключевые слова" включал все доступные ключевые слова, которые в результате.

Если я удаляю строку WHERE, я получаю список, в котором столбец «ключевые слова» включает все доступные ключевые слова для этого результата.

Как можно выбрать ключевое слово и включить в результаты все ключевые слова?

1 Ответ

0 голосов
/ 11 мая 2018

Используйте предложение HAVING вместо WHERE:

SELECT p.*,
       GROUP_CONCAT(k.name SEPARATOR ', ') AS keywords
FROM publications p LEFT JOIN
     keyword_relations kr
     ON kr.pid = p.id  INNER JOIN
     keywords k
     ON kr.kid = k.id
GROUP BY p.id
HAVING SUM(k.id = 1) > 0
ORDER BY p.date DESC;

Примечания:

  • Предложение HAVING подсчитывает количество ключевых слов, соответствующих условию,> 0 означает, что есть один.
  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Предложение ON должно идти сразу после таблиц.Одна из целей синтаксиса JOIN - поместить условия соединения рядом со ссылками на таблицы, а не далеко вниз в запросе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...