我有一个很好的疑问:
SELECT DISTINCT( p.id ),
p.last_name,
p.first_name,
c.club_name,
c.join_date,
e.Full_name
FROM people AS p,
club AS c,
employee AS e
WHERE c.people_id = p.id
AND p.id_ofproducer = e.id
AND size IN ( 'Large', 'Medium' )
它几乎完成了我的预期。希望改变这一点,以便获得大小为中等或大的所有记录,无论哪里有俱乐部(c)或EMployee(e)相关记录。
AND:我真的希望c.club_name,c.join_date和。或e.Full_name如果为NULL则返回“ - ”。
所以我的问题是双重的。
答案 0 :(得分:2)
回答1:您的加入是INNER JOIN
,这意味着它必须在两个表中,您需要切换到LEFT JOIN
。
回答2:是,使用IFNULL(c.club_name,'--')
或COALESCE(c.club_name,'--')
。
SELECT DISTINCT( p.id ),
p.last_name,
p.first_name,
IFNULL(c.club_name,'--') AS club_name,
IFNULL(c.join_date,'--') AS join_date,
IFNULL(e.Full_name,'--') AS Full_name
FROM people AS p,
LEFT JOIN club AS c ON c.people_id = p.id
LEFT JOIN employee AS e ON p.id_ofproducer = e.id
WHERE size IN ( 'Large', 'Medium' )
答案 1 :(得分:1)
您加入的问题是INNER
加入,您需要LEFT
加入。此外,最好使用ANSI连接语法,而不是在WHERE
子句中隐藏连接条件。
至于将NULL转换为字符串,请使用MySQL Coalesce function。
新查询看起来像这样:
SELECT DISTINCT( p.id ),
p.last_name,
p.first_name,
COALESCE(c.club_name, '---'),
COALESCE(c.join_date, '---'),
COALESCE(e.Full_name, '---')
FROM people AS p
LEFT JOIN club c ON p.id = c.people_id
LEFT JOIN employee e ON p.id_ofproducer = e.id
WHERE size IN ('Large', 'Medium')
我不太确定DISTINCT(p.id)
发生了什么事,但如果它正在做的事情对你有用,那么一切都很好。
答案 2 :(得分:0)
使用左加入和ifnull()
SELECT DISTINCT p.id,
p.last_name,
p.first_name,
ifnull(c.club_name, '--') club_name,
ifnull(c.join_date, '--') join_date,
ifnull(e.Full_name, '--') Full_name
FROM people p
LEFT JOIN 0club c c.people_id = p.id
LEFT JOIN employee e ON p.id_ofproducer = e.id
WHERE size IN ( 'Large', 'Medium' )
答案 3 :(得分:0)
1. Use LEFT OUTER JOIN
2. Use ifnull() function
SELECT DISTINCT( p.id ),
p.last_name,
p.first_name,
ifnull(c.club_name, '--') as club_name,
ifnull(c.join_date, '--') as join_date,
ifnull(e.Full_name, '--') as Full_name
FROM people AS p
LEFT OUTER JOIN club AS c ON c.people_id = p.id
LEFT OUTER JOIN employee AS e ON p.id_ofproducer = e.id
WHERE size IN ( 'Large', 'Medium' )