Выбрать все данные, соответствующие строке в таблице (SQL)

Обновлено: с помощью MySQL.

В этом примере у меня есть таблица сообщений, таблица пользователей, таблица Tagged_Posts и таблица тегов.

В таблице сообщений есть внешний ключ для user_id, который соответствует таблице Users и столбцу id.

В таблице Tagged_posts есть два внешних ключа, один для tag_id и один для post_id.

В таблице тегов есть только идентификатор и слаг.

Я пытаюсь запросить сообщения и получить все данные, относящиеся к этому сообщению, т.е. данные Post, данные пользователя, о котором написано сообщение, и какие теги принадлежат этому сообщению.

У одного сообщения может быть много тегов.

Это SQL-запрос, который я использую:

$sql = "SELECT posts.title, users.name, users.handle, users.email, tags.slug as tags
from posts 
INNER JOIN users ON posts.user_id = users.id
INNER JOIN tagged_posts ON posts.id = tagged_posts.post_id
INNER JOIN tags ON tagged_posts.tag_id = tags.id";

Поскольку с этим конкретным сообщением связано 3 тега, запрос возвращает одно и то же сообщение 3 раза с разными значениями, указанными для тега. Увидеть ниже:

Array
(
    [0] => Array
        (
            [title] => This is my first Post!
            [name] => exampleuser
            [handle] => example
            [email] => [email protected]
            [tags] => database-design
        )

    [1] => Array
        (
            [title] => This is my first Post!
            [name] => exampleuser
            [handle] => example
            [email] => [email protected]
            [tags] => sql
        )

    [2] => Array
        (
            [title] => This is my first Post!
            [name] => exampleuser
            [handle] => example
            [email] => [email protected]
            [tags] => php
        )

)

Могу ли я сделать один запрос и получить все, что связано с сообщением?

Какую базу данных вы используете?

Gordon Linoff 19.08.2018 17:42

MySQL. Я добавлю это к своему вопросу, спасибо

good_afternoon 19.08.2018 17:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите объединить результаты вместе. Например, в MySQL вы бы сделали:

select p.title, u.name, u.handle, u.email, group_concat(t.slug) as tags
from posts p join
     users u 
     on p.user_id = u.id join
     tagged_posts tp
     on p.id = tp.post_id join
     tags t
     on tp.tag_id = t.id
group by p.title, u.name, u.handle, u.email;

на самом деле я только что столкнулся с проблемой с group_concat. Если у меня есть несколько сообщений, он покажет только 1 сообщение и добавит все теги вместе, даже если они не принадлежат этому post_id. вы хотите, чтобы я отредактировал свой вопрос?

good_afternoon 19.08.2018 18:07

О, ты прав ... Не знаю, что случилось в первый раз. На самом деле он работает так, как должен. еще раз спасибо

good_afternoon 19.08.2018 19:10

эй, у вас есть еще один вопрос по этому поводу, если у вас когда-нибудь появится минутка: stackoverflow.com/questions/52139458/…

good_afternoon 02.09.2018 19:35

Другие вопросы по теме