0

我有一个很好的查询:

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) 或员工 (e) 相关记录。

并且:如果 c.club_name、c.join_date 和.或 e.Full_name 为 NULL,我真的希望它们返回为“--”。

所以我的问题是两个方面。

  1. 我的 SQL/Join 出了什么问题
  2. 是否可以返回一个字符串来代替 Null?
4

4 回答 4

2

答案 1:您的联接是一个INNER JOIN意思,它必须在两个表中,您需要切换到LEFT JOIN.
答案 2:是的,使用IFNULL(c.club_name,'--')or 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' ) 
于 2013-05-30T21:28:07.893 回答
1

您加入的问题在于它是一个INNER加入,您需要一个LEFT加入。此外,最好使用 ANSI 连接语法,而不是将连接条件隐藏在WHERE子句中。

至于将 NULL 转换为字符串,请使用 MySQL Coalesce 函数

新查询看起来像这样:

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)但如果它对你有用,那么一切都很好。

于 2013-05-30T21:30:16.883 回答
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' )
于 2013-05-30T21:32:48.857 回答
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' ) 
于 2013-05-30T21:30:13.857 回答