gpt4 book ai didi

mysql - 在 1 个查询中连接多个表导致重复

转载 作者:行者123 更新时间:2023-11-29 21:49:30 25 4
gpt4 key购买 nike

我有一个名为“游戏”的表。

一个游戏可以有多个标签和多个作者。每个标签或作者可以属于多个游戏。

我想用单独的表格来跟踪每个单独的标签和每个单独的作者,因此我有以下表格及其列:

游戏:id,...游戏标签:id、名称game_tags_map:id、game_id、tag_id游戏作者:id、姓名game_authors_map:id、game_id、author_id

如果我想获取包含所有标签的游戏​​记录,我执行以下查询:

SELECT g.*,
GROUP_CONCAT(gt.name) as tag_names, GROUP_CONCAT(gt.id) as tag_ids
FROM games g
INNER JOIN game_tags_map gtm ON g.id = gtm.game_id
INNER JOIN game_tags gt ON gtm.tag_id = gt.id
WHERE g.id = 1
GROUP BY g.id

我得到:

id ... category_names    category_ids
1 ... 3D,2 Player 2,1

正是我想要的。但是,我该如何执行才能获取author_names 和author_ids 呢?我尝试:

SELECT g.id,
GROUP_CONCAT(gt.name) as tag_names, GROUP_CONCAT(gt.id) as tag_ids,
GROUP_CONCAT(ga.name) as author_names, GROUP_CONCAT(ga.id) as author_ids
FROM games g
INNER JOIN game_tags_map gtm ON g.id = gtm.game_id
INNER JOIN game_tags gt ON gtm.tag_id = gt.id
INNER JOIN game_authors_map gam ON g.id = gam.game_id
INNER JOIN game_authors ga ON gam.author_id = ga.id
WHERE g.id = 1
GROUP BY g.id

但我得到:

id ... category_names           category_ids      author_names          author_ids
1 ... 3D,2 Player,3D,2 Player 2,1,2,1 Tom,Dave,Tom,Dave 1,2,1,2

换句话说,一切都会加倍。我还注意到它花费的时间几乎比我预期的时间长 10 倍。第一个查询耗时 0.001s,第二个查询耗时 0.008s。

我做错了什么?

最佳答案

最简单的解决方案是在 GROUP_CONCAT 上使用不同的:

SELECT
g.id,
GROUP_CONCAT(DISTINCT gt.name) as tag_names,
GROUP_CONCAT(DISTINCT gt.id) as tag_ids,
GROUP_CONCAT(DISTINCT ga.name) as author_names,
GROUP_CONCAT(ga.id) as author_ids
FROM ....

另一种解决方案是在子查询中使用 GROUP_CONCAT,如下所示:

SELECT
g.id,
tag_names,
author_names,
...
FROM
games g INNER JOIN (SELECT id, GROUP_CONCAT(...) AS tag_names
FROM ...
GROUP BY id) t
ON g.id=t.id
INNER JOIN (SELECT id, GROUP_CONCAT(...) AS author_names
FROM ...
GROUP BY id) a
ON g.id = a.id

关于mysql - 在 1 个查询中连接多个表导致重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33788107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com