MySQL 在内连接查询中合并?
MySQL COALESCE in inner join query?
我是 SQL 的新手,我有一个非常基本的查询:
SELECT role.name AS role,
`username`,
game.name AS favorite_game,
`reg_date`,
`other_game`
FROM `user`
INNER JOIN role
ON user.role = role.rid
INNER JOIN game
ON user.favorite_game = game.gid
ORDER BY role.weight DESC, user.reg_date ASC
它包含三个tableuser
、role
和game
。
在 user
table 中,列 favorite_game
可以为空。如果是这种情况,我想显示 other_game
的内容而不是 game
table.
中的名称
反之亦然。 other_games
可以为空,我想获取游戏名称
一列总是有一个值,因此它们不能同时为空。
我怎样才能做到这一点?我听说过 COALESCE
,但我不知道如何在我的查询中使用它以及是否应该使用它。
为此,您需要在游戏中 LEFT JOIN
两次并使用 IFNULL
到 select 值,例如:
SELECT role.name AS role,
`username`,
IFNULL(fg.name, og.name) AS favorite_game,
IFNULL(og.name, fg.name) AS other_game,
`reg_date`, `other_game`
FROM `user`
INNER JOIN role
ON user.role = role.rid
LEFT JOIN game fg
ON user.favorite_game = fg.gid
LEFT JOIN game og
ON user.other_game = og.gid
ORDER BY role.weight DESC, user.reg_date ASC
Here's IFNULL
的文档。
是的,coalesce
正是您所需要的。它有两个参数,returns 如果它不为空则第一个参数,否则第二个参数。
根据您编写查询的方式,我假设没有 table 名称作为前缀的字段来自 user
table。如果是这种情况,您需要 left join
和 game
table(如果没有关联的行):
SELECT tr.name AS role,
tu.username,
coalesce(tg.name, tu.other_game) AS favorite_game,
tu.reg_date
FROM user tu
JOIN role tr
ON tu.role = tr.rid
LEFT JOIN
game tg
ON tu.favorite_game = tg.gid
ORDER BY tr.weight DESC,
tu.reg_date ASC
也可以使用case语句。
SELECT
role.name AS role,
`username`,
(CASE WHEN game.name IS NOT NULL THEN game.name
WHEN game.name IS NULL THEN other_game END) AS favorite_game,
`reg_date`
FROM `user`
INNER JOIN role
ON user.role = role.rid
INNER JOIN game
ON user.favorite_game = game.gid
ORDER BY role.weight DESC, user.reg_date ASC;
我是 SQL 的新手,我有一个非常基本的查询:
SELECT role.name AS role,
`username`,
game.name AS favorite_game,
`reg_date`,
`other_game`
FROM `user`
INNER JOIN role
ON user.role = role.rid
INNER JOIN game
ON user.favorite_game = game.gid
ORDER BY role.weight DESC, user.reg_date ASC
它包含三个tableuser
、role
和game
。
在 user
table 中,列 favorite_game
可以为空。如果是这种情况,我想显示 other_game
的内容而不是 game
table.
反之亦然。 other_games
可以为空,我想获取游戏名称
一列总是有一个值,因此它们不能同时为空。
我怎样才能做到这一点?我听说过 COALESCE
,但我不知道如何在我的查询中使用它以及是否应该使用它。
为此,您需要在游戏中 LEFT JOIN
两次并使用 IFNULL
到 select 值,例如:
SELECT role.name AS role,
`username`,
IFNULL(fg.name, og.name) AS favorite_game,
IFNULL(og.name, fg.name) AS other_game,
`reg_date`, `other_game`
FROM `user`
INNER JOIN role
ON user.role = role.rid
LEFT JOIN game fg
ON user.favorite_game = fg.gid
LEFT JOIN game og
ON user.other_game = og.gid
ORDER BY role.weight DESC, user.reg_date ASC
Here's IFNULL
的文档。
是的,coalesce
正是您所需要的。它有两个参数,returns 如果它不为空则第一个参数,否则第二个参数。
根据您编写查询的方式,我假设没有 table 名称作为前缀的字段来自 user
table。如果是这种情况,您需要 left join
和 game
table(如果没有关联的行):
SELECT tr.name AS role,
tu.username,
coalesce(tg.name, tu.other_game) AS favorite_game,
tu.reg_date
FROM user tu
JOIN role tr
ON tu.role = tr.rid
LEFT JOIN
game tg
ON tu.favorite_game = tg.gid
ORDER BY tr.weight DESC,
tu.reg_date ASC
也可以使用case语句。
SELECT
role.name AS role,
`username`,
(CASE WHEN game.name IS NOT NULL THEN game.name
WHEN game.name IS NULL THEN other_game END) AS favorite_game,
`reg_date`
FROM `user`
INNER JOIN role
ON user.role = role.rid
INNER JOIN game
ON user.favorite_game = game.gid
ORDER BY role.weight DESC, user.reg_date ASC;