SQL显示甚至空记录

时间:2014-09-10 23:36:23

标签: mysql sql

以下是我的sql语句

SELECT a.purchase_id,
       b.username,
       a.purchase_packageid,
       a.purchase_tradelimit,
       a.purchase_pincode,
       a.purchase_datetime,
       c.packages_name ,
  FROM purchase a,
       accounts b,
       packages c 
 WHERE a.purchase_userid=b.UserId 
   AND c.packages_id=a.purchase_packageid

基本上问题是我有3张桌子

Accounts
Purchase
Packages

主表是购买,表格中有purchase_userid,我需要用它来从表帐户中获取用户名

所以现在问题是我得到的行里面的purchase_userid是空白的,因为它的空白,它不会把它的记录画成空。

此sql语句中显示的唯一记录只是那些包含purchase_userid,

的记录

由于我的网络应用程序稍后将填写purchase_userid的值, 我仍然想要选择没有purchase_userid的行和那些带有purchase_userid

的行

感谢您的帮助!!

2 个答案:

答案 0 :(得分:2)

即使在帐户中找不到匹配的记录,您也需要使用左连接来加载购买中的所有记录。

SELECT a.purchase_id, b.username, a.purchase_packageid, a.purchase_tradelimit,   a.purchase_pincode, a.purchase_datetime, c.packages_name 
FROM purchase a LEFT JOIN accounts b 
ON a.purchase_userid=b.UserId 
JOIN packages c
ON c.packages_id=a.purchase_packageid

这篇文章很好地解释了不同类型的连接:What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

答案 1 :(得分:1)

当您需要的是LEFT JOIN操作时,您在表之间使用了旧的语法来进行INNER JOIN。试试这个:

   SELECT a.purchase_id,
          b.username,
          a.purchase_packageid,
          a.purchase_tradelimit,
          a.purchase_pincode,
          a.purchase_datetime,
          c.packages_name
     FROM purchase AS a
LEFT JOIN accounts AS b  ON a.purchase_userid    = b.UserId
LEFT JOIN packages AS c  ON a.purchase_packageid = c.packages_id

这对您更有效,因为您使用的JOIN类型会抑制a表格中bc表格中未匹配的记录。此LEFT JOIN将保留a表记录,并将NULL值放在要求其他两个数据的位置。