#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: такая схема обычно имеет ограничения внешнего ключа от связующей таблицы до ссылочных таблиц, поэтому в связующей таблице нет «бесхозных» записей. Если это так, запрос гарантированно вернет тот же результат, что и решение с двумя объединениями, и, конечно, более эффективен.