繁体   English   中英

具有连接和计数的复杂 sql 查询

[英]Complex sql query with join and count

我目前在编写 SQL 查询时遇到问题,

我有 3 个表:

  • 视频游戏
ID 姓名
1个 光环
2个 绿巨人
  • 游戏类型
ID 游戏编号
1个 1个 (类型 ID 1 到游戏 ID 1)
2个 1个 (类型 ID 2 到游戏 ID 1)
2个 2个 (类型 ID 2 到游戏 ID 2)
3个 2个 (类型 ID 3 到游戏 ID 2)
  • 游戏标签
ID 游戏编号
2个 1个 (标签 id 2 到游戏 id 1)
2个 2个 (标签 id 2 到游戏 id 2)
1个 2个 (标签 id 1 到游戏 id 2)

这是我想要的结果,寻找具有最多类型 IN(2,3) 和大多数标签 IN(1) 的游戏

videos_games.name 计数标签 公共标签 计数流派 常见类型
绿巨人 1个 1个 2个 2,3
光环 0 空的 1个 2个

我目前有这个,这是一个语法错误

SELECT name,id, 
COUNT(distinct games_genres.id) as num_genres, COUNT(distinct
games_tags.id) as num_genres    INNER JOIN games_genres ON
(videos_games.id = games_genres.game_id) INNER JOIN games_tags ON
(videos_games.id = games_tags.game_id)
WHERE 
games_to_genres.genre_id IN(3,10)  games_tags.genre_id IN(31,7)
ORDER BY
deus_games.num_genres DESC

如果有人这样做,我将非常感激!

我假设您要通过GROUP BY查询请求COUNT(*)
您还需要合并几个结果表。
就像是

SELECT name, COUNT(*)
FROM
(SELECT name
FROM videos_games
INNER JOIN game_tags
ON game_tags.game_id = videos_games.id
WHERE game_tags.id IN(10, 3)
UNION ALL
SELECT name
FROM videos_games
INNER JOIN games_genres
ON games_genres.game_id = videos_games.id
WHERE games_genres.id IN(17, 22)) AS nameslist
GROUP BY NAME
ORDER BY COUNT(*) DESC ;

请参阅此处的示例https://sqltest.net/#1191095

编辑:我明白了,然后为了将常见标签和流派的列表以及它们的数量分开,你需要这样的东西

SELECT name, COALESCE (count_tags, 0), common_tags,
 COALESCE (count_genres, 0), common_genres
FROM videos_games
LEFT OUTER JOIN
 (SELECT game_id, COUNT(*) count_tags, GROUP_CONCAT(id SEPARATOR ', ') common_tags
 FROM game_tags
 WHERE id IN (2, 3)
 GROUP BY game_id) AS tag_tab
ON tag_tab.game_id = videos_games.id
LEFT OUTER JOIN
 (SELECT game_id, COUNT(*) count_genres, GROUP_CONCAT(id SEPARATOR ', ') common_genres
 FROM games_genres
 WHERE id IN (1)
 GROUP BY game_id) AS genre_tab
ON genre_tab.game_id = videos_games.id

如果您想按计数总和进行ORDER BY ,请确保它们是数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM