MySQL Query возвращает одну и ту же строку дважды - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь отобразить данные, используя 3 таблицы

posts
  - id
  - category_id
  - user_authors_id
  - title
  - status

user_authors
  - id
  - author_name

categories
  - id
  - name

subcategories
  - id
  - name

Я пытаюсь сделать это.Я создаю панель просмотра, которая будет отображать сообщения.Итак, я использую 3 таблицы.От user_authors я получу имя автора, из таблицы категорий я получу имя категории, теперь у таблиц категорий есть идентификатор подкатегории, поэтому я также хочу получить имя подкатегории.

У меня две строкив таблице posts с идентификатором 29 and 30, но когда я запускаю приведенный ниже запрос, он показывает 2 записи с одинаковыми данными.

SELECT 
   posts.id, 
   categories.name AS cat_name, 
   subcategories.name AS subcat_name, 
   posts.title, 
   user_authors.author_name, 
   posts.created, 
   posts.status
FROM posts 
INNER JOIN user_authors ON (user_authors.id = posts.user_author_id) 
INNER JOIN categories ON(posts.category_id = categories.id) 
INNER JOIN subcategories ON (categories.id = subcategories.category_id)

Но, если я удалю этот оператор INNER JOIN subcategories ON (categories.id = subcategories.category_id) и выполню запрос, он работает отлично, все строки показывает правильно.

Что происходит, я не пытаюсь понять это.Где неправильный запрос, также он не показывает ошибки.

1 Ответ

0 голосов
/ 22 декабря 2018
INNER JOIN subcategories ON (categories.id = subcategories.category_id)

Поскольку ваш запрос возвращает ожидаемое значение, в подкатегориях должна быть одна и только одна запись, соответствующая указанному post:

  • , если более одного subcategory соответствует данному post, строка post будет дублироваться в результатах
  • , если subcategory не соответствует данному post, post не будет отображаться в результатах

В зависимости от вашего варианта использования, вы хотите:

  • не JOIN subcategory, чтобы избежать дублирования post s
  • LEFT JOIN subcategory вместо INNER JOIN subcategory чтобы избежать фильтрации posts без subcategory

Если у вас есть несколько подкатегорий для данного сообщения, и вы все еще хотите отобразить одну строку в результатах, вы можете использоватьGROUP_CONCAT агрегатная функция для объединения subcategories в одно поле:

SELECT 
   posts.id, 
   categories.name AS cat_name, 
   GROUP_CONCAT( subcategories.name, ', ') AS subcat_names, 
   posts.title, 
   user_authors.author_name, 
   posts.created, 
   posts.status
FROM posts 
INNER JOIN user_authors ON (user_authors.id = posts.user_author_id) 
INNER JOIN categories ON(posts.category_id = categories.id) 
LEFT  JOIN subcategories ON (categories.id = subcategories.category_id)
GROUP BY 
   posts.id, 
   categories.name, 
   posts.title, 
   user_authors.author_name, 
   posts.created, 
   posts.status
...