MySQLi - лучший способ запроса выбора из нескольких таблиц - PullRequest
0 голосов
/ 06 июня 2018

Я не могу понять, как сделать запрос из нескольких таблиц, используя таблицу «связывания», чтобы указать на нее.У меня есть таблица для «Шоу» и таблица для «Жанры», у меня есть «таблица ссылок», в которой у меня есть show_id и genre_id.Который подключается к id в жанрах и id в шоу.Моя проблема в том, что я не знаю, возможно ли собрать таблицу name из жанров в том же самом списке, где я запрашиваю шоу.

Прямо сейчас, это то, что я делаю:

$query = $DB->query('SELECT * FROM shows');

while ($show = $query->fetch_assoc()) {
    $get_genres = $DB->query('SELECT genre_id, show_id FROM shows_genres WHERE show_id = ' . $show['id']);
    $allgenres = '';
    while ($genre = $get_genres->fetch_assoc()) {
        $genre_name = $DB->query('SELECT id, name FROM genres WHERE id = ' . $genre['genre_id'])->fetch_assoc();
        $allgenres .= $genre_name['name'];
    }

И вполне возможно, что в «связующей таблице» шоу имеет более одного жанра, несколько строк genre_id указывают на один и тот же show_id.

Грязно, не правда ли??Есть ли как выбрать все это из первого запроса?

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

SHOWS: id, title, summary
SHOWS_GENRES: show_id, genre_id
GENRES: id, name, description

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете сделать это с помощью одного оператора SQL, используя JOIN:

SELECT
    g.name,
    g.description,
    s.title,
    s.summary
FROM SHOWS s
JOIN SHOWA_GENRES sg
ON s.id = sg.show_id
JOIN GENRES g
ON sg.genre_id = g.id
WHERE s.id = show['id']
ORDER BY g.name.s.title;

Это вернет одну строку для жанра с разделенным запятыми списком шоу в этом жанре:

SELECT
    g.name,
    g.description,
    GROUP_CONCAT(s.title) as shows
FROM SHOWS s
JOIN SHOWA_GENRES sg
ON s.id = sg.show_id
JOIN GENRES g
ON sg.genre_id
GROUP BY g.id
ORDER BY g.name;

Если вам нужен список шоу и их жанров, вы можете использовать это:

SELECT
    s.title,
    s.summary,
    GROUP_CONCAT(g.name) as `genres`
FROM SHOWS s
JOIN SHOWA_GENRES sg
ON s.id = sg.show_id
JOIN GENRES g
ON sg.genre_id
GROUP BY s.id
ORDER BY s.title;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...