MySQLi - 从多个表中查询select的更好方法

时间:2018-06-05 23:55:49

标签: php mysql mysqli

我无法通过"链接"来了解如何从多个表中进行查询。表指向它。 我有一张桌子用于"节目"和#34;流派"的表格,我有一个"链接表"其中我有show_idgenre_id。哪个连接到流派中的id和节目中的id。我的问题是,我不知道是否可以在我查询节目的同一个选择中从Genres表中收集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 :(得分:0)

您可以使用JOIN使用单个SQL语句执行此操作:

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;

这将为每个流派返回一行,并在该流派中使用逗号分隔的show列表:

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;