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

rjee0c15  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(357)

我不知道如何从多个表中查询,而是使用一个“链接”表来指向它。我有一张“表演”表和一张“流派”表,我有一张“链接表”,其中有 show_id 以及 genre_id . 连接到 id 在体裁和 id 在节目中。我的问题是,我不知道是否有可能收集 name 从genres表中选择我在同一个地方查询节目。
现在,这就是我要做的:

$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'];
    }

在“链接表”上,一个节目可能有多个流派,多个流派id行指向同一个节目id。
很乱,是吗?有没有办法从第一个查询中选择所有这些?
表格结构如下:

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

qaxu7uf21#

您可以通过使用联接的单个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;

这将为每个流派返回一行,并以逗号分隔该流派中的节目列表:

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;

相关问题