Объединение трех таблиц и группировка

#php #sql #sqlite

#php #sql #sqlite

Вопрос:

Я совсем новичок в SQL, php и т.д., так что приношу свои извинения за это. У меня есть три таблицы: content, author_content и authors. Я использую инструкцию SQL для получения этих данных json

 ----------------------
|authorId | contentId|
|--------------------|
|1        |1         |
|1        |2         |
|2        |2         |
|2        |3         |
|3        |4         |
----------------------
 

Но я хочу, чтобы это выглядело так, где каждый автор сгруппирован со всем своим контентом.


 |authorId | contentId|
|--------------------|
|1        |1,2       |
|2        |1,3       |
|3        |4         |
----------------------
 

Я не уверен, возможно ли это с помощью SQL, и подумал, что это может быть лучшим решением для PHP.
Оператор SQL, который я использую:

 SELECT authors.authorId, content.contentId
FROM content
INNER JOIN content_authors
      ON content_authors.contentId = content.contentId
INNER JOIN authors
      ON content_authors.authorId = authors.authorId
 

Заранее благодарю.

Комментарии:

1. GROUP BY и group_concat(? или что-то подобное.)

Ответ №1:

Попробуйте group_concat собрать все идентификаторы содержимого в каждой группе идентификаторов авторизации:

 SELECT authors.authorId, GROUP_CONCAT(content.contentId)
FROM content
INNER JOIN content_authors
      ON content_authors.contentId = content.contentId
INNER JOIN authors
      ON content_authors.authorId = authors.authorId
GROUP BY authors.authorId
 

Ответ №2:

Нет необходимости присоединяться. Вы можете получить желаемый результат непосредственно из таблицы мостов content_author :

 select authorid, group_concat(contentid) as contentids
from content_author
group by authorid
 

Комментарии:

1. таблицы content и author могут содержать только подмножество таблиц в таблице мостов …? например, в и в есть только 1 строка author content , но в таблице мостов много строк, и в этом случае ваш запрос может возвращать много строк?

2. @mck: такая схема обычно имеет ограничения внешнего ключа от связующей таблицы до ссылочных таблиц, поэтому в связующей таблице нет «бесхозных» записей. Если это так, запрос гарантированно вернет тот же результат, что и решение с двумя объединениями, и, конечно, более эффективен.