2017-04-21 2 views
1

나는 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 

은 세 개의 테이블 user, rolegame이 포함되어 있습니다.

user 테이블에서 favorite_game은 null 일 수 있습니다. 이 경우 game 테이블의 이름 대신 other_game의 내용을 표시하려고합니다.

같은 방법으로 돌아갑니다. other_games은 null 일 수 있으며 게임의 이름을 얻고 싶습니다.

하나의 열은 항상 값을 가지므로 한 번에 null이 될 수 없습니다.

어떻게하면됩니까? 나는 COALESCE에 대해 들었지만, 내 쿼리에서 그것을 사용하는 법을 잘 모르겠다. 이를 위해

+1

테이블의 구조 게시 (텍스트) – etsa

답변

3

예, coalesce은 필요한 것입니다. 이 함수는 두 개의 매개 변수를 사용하여 작동하며, null이 아닌 경우 첫 번째 매개 변수를 반환하고 그렇지 않으면 두 번째 매개 변수를 반환합니다.

당신의 쿼리를 작성하는 방식에서 접두사로 테이블 이름이없는 필드는 user 테이블에 있다고 가정합니다. 그런 경우, 당신은 game 테이블과 left 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

당신은 환영합니다 :) –

2

, 당신은 :,

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에 대한 문서를 예컨대을 게임에 LEFT JOIN에 두 번 필요 값을 선택 IFNULL를 사용합니다.

1

또한이 경우 문을 사용할 수 있습니다.

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;