MySQL COALESCE在内部连接查询中?

问题描述:

我是新来的SQL和我有一个非常基本的查询:MySQL COALESCE在内部连接查询中?

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 

它包含三个表userrolegame

user表中,列favorite_game可以为空。如果是这种情况,我想显示other_game的内容,而不是game表中的名称。

也是如此。 other_games可以为空,我想获得游戏的名称。

一列总是有一个值,所以它们不能同时为空。

我该如何做到这一点?我听说过COALESCE,但我不知道如何在查询中使用它,如果我应该的话。

+1

请发表您的表格的文章结构(文字) – etsa

是的,​​3210正是你所需要的。它的工作原理是两个参数,如果不为空则返回第一个参数,否则返回第二个参数。

从您编写查询的方式来看,我假定没有表名称作为前缀的字段来自user表。如果是这样的话,你需要用gameleft join(如果没有相关的行):

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 
+0

这正是我所需要的。谢谢! – Marlon

+0

不客气:) –

对于这一点,你需要LEFT JOIN博弈两次,使用IFNULL选择相应的值,例如:

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'sIFNULL的文档。

您也可以使用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;