如何从多个表中获取多个列并在非空列上显示数据,并使用MYSQL中的连接在空列上显示null或0

时间:2014-09-30 13:12:14

标签: mysql sql database mysqli mysql-workbench

我想知道如何从多个表中获取多个列,即使一个表中的一列不存在,并返回一个或多个用于连接的表中存在的列

例如:

表:

user_pr_details:
 [id] [first_name] [last_name]
urname: 
 [id] [email] [username]
profile_pic:
 [id] [file_name ]

SQL:

SELECT a.first_name, a.last_name, b.username, c.file_name 
FROM user_pr_details a,urname b,profile_pic c 
WHERE a.user_id = b.urname_id 
and b.urname_id = c.user_id 
and c.user_id in (7,8,9)

问题:

for user_id in (7,8) all the columns in all three table exists..
whereas for user_id in (9) [file_name] doesn't exists in profile_pic table
so the query returns two rows for user_id in (7,8)

我需要什么? 如果某个列不存在于一个表中,则返回具有该数据的其余列,并在不存在的col的位置显示null或零。

1 个答案:

答案 0 :(得分:2)

我想建议这个查询。

SELECT
      upd.first_name
    , upd.last_name
    , u.username
    , pp.file_name
FROM urname u
LEFT OUTER JOIN user_pr_details a ON u.urname_id = upd.user_id
LEFT OUTER JOIN profile_pic pp ON u.urname_id = pp.user_id
WHERE u.urname_id  IN (7, 8, 9)

在创建SQL查询时,您需要做的第一个选择是“from table”。也就是说,您将参考的第一个表。这是一个重要的选择!理想情况下,该表“将永远可用于”查询,其他表“将关联但不控制”查询逻辑。

此查询与用户有关,因此有关用户的主表应为“from table”。

之后,我们需要“加入”其他信息,您已经在加入,但是您通过where clausejoin conditions a.user_id = b.urname_idLEFT OUTER JOIN的方式以旧式方式执行此操作(尽管这存在于where子句中,它仍然是一个连接条件)。我使用的是ANSI 92连接语法,这样做的好处之一就是我可以轻松地使用“外部”连接。这些连接类型允许记录存在于一个表中,但不存在于另一个表中。 LEFT OUTER JOIN表示“from table”在左侧,因此记录可能存在于表urname中,而user_pr_details或profile_pic中没有任何匹配的记录。

如果不熟悉此语法,我建议this visual guide to joins,但请注意“OUTER”是一个可选字,因此WHERE clause通常只是“LEFT JOIN”

注意我也改变了{{1}}。我们希望确保我们过滤信息的方式在“from table”上工作,如果可能的话,因为我们允许来自其他表的NULL。


小注:我使用了不同的表别名。我更喜欢这些与表名有关系所以'u'表示urname; user_pr_details的'upd';和'pp'代表profile_pic。我个人认为a,b,c太抽象了,如果你需要调整查询结构,那么它们就会很容易失序(就像他们为我做的那样!)