如果使用左连接在表中不存在数据,如何将记录显示为空

时间:2014-09-08 11:07:46

标签: php mysql join left-join

SELECT MH.Home_Address_Id,MH.Member_Id,MH.First_Name,MH.Middle_Name,
       MH.Last_Name,MH.Address AS Preferred_Address,MH.City AS Preferred_City,
       MH.State AS Preferred_State,MH.Zip ASPreferred_Zip,MH.Nickname,
       MH.Phone,MH.Mobile,MH.Email,
       (CASE WHEN MH.Preferred=0 THEN 'Work Address' 
             WHEN MH.Preferred=1 THEN 'Home Address' END)AS Preferred,
       (CASE WHEN MP.Status=0 THEN 'Current'
             WHEN MP.Status=1 THEN 'Past due' 
             WHEN MP.Status=2 THEN 'Paid' END)AS Status,
       MP.Payment_Amount,MP.Payment_Date,MT.Admiral_Title,MT.Spouse_Title,
       MT.Couple_Title,MS.First_Name AS Spouse_name,
       MS.Nickname AS Spouse_Nickname, 
       MS.Email AS Spouse_Email,sca.SubCategory_Name AS Admiral_Type_Id, 
       scr.SubCategory_Name AS Royalty_Type_Id,
       scp.SubCategory_Name AS Parent_Type_Id,
       scg.SubCategory_Name AS Guest_Type_Id,
       MM.Member_Note, g.Guest_Name AS Guest_Of
FROM
member_home_address MH,
member_payment_master MP,
member_mailing_title MT,
member_spouse_info MS,
member_master MM,
LEFT JOIN guest g ON g.Member_Id = MM.Member_Id
LEFT JOIN member_subcategory sca ON sca.SubCategory_Id = MM.Admiral_Type_Id
LEFT JOIN member_subcategory scr ON scr.SubCategory_Id = MM.Royalty_Type_Id
LEFT JOIN member_subcategory scp ON scp.SubCategory_Id = MM.Parent_Type_Id
LEFT JOIN member_subcategory scg ON scg.SubCategory_Id = MM.Guest_Type_Id
WHERE MH.Member_Id IN
(1,2,3,4,6,7,9,10,11,13,14,16,17,18,19,20,21,22,23,24,25,26,29,31,33,34,35,36,37,38,39,40,41 ,44,45,46,47,48,49,52,53,55,57,58,59,61,62,63,64,65,66,67,68,69,70,71,72,73,75,76,78,80,81,
87,88,89,91,92,93,94,95,96,97,98,99,100,101,102,103,104,106,107,108,109,111,113,115,116,117,
118,119,121,122,123,124,128,129,130,131,133,134,135,136,137,138,139,140,141,143,145,146,148,
149,150,151,152,153,155,156,158,159,160,163,164,166,167,169,170,171,172,173,174,177,179,180,
181,182,183,185,186,187,189,191,192,193,194,196,198,199,202,205,206,209,210,211,212,213,214,
217,218,219,221,222,223,224,227,228,229,231,234,235,236,238,239,240,243,245,246,247,248,249,
251,252,253,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,274,275,277,
280,281,284,285,286,287,289,290,291,292,294,295,296,298,300,301,302,303,304,305,307,308,310,
311,313,314,315,316,318,320,321,322,323,324,325,327,328,331,332,334,336,337,338,339,341,343,
344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,361,931,934,935,936,937,938,939,
940,941,942,944,945,946,947,948,950,951,952,1431,1432,1433,1434,1435,1436,1437,1438,1439,144
0,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1986,1987,1988,
1989,1990,1991,1992,1993,1994,1995,1996,3168,3164,3142,3143,3144,3154,3155,3156,3157,3158,
3159,3160,3161,3162,3165,3167)
    AND MH.Member_Id = MP.Member_Id
    AND MH.Member_Id = MT.Member_Id
    AND MP.Member_Id = MS.Member_Id
    AND MP.Member_Id = MM.Member_Id

这里为member_id'10'我们在member_spouse_info表中没有记录。它正在跳过总的member_id。如何使用上述查询获取member_id的数据?为什么省略某些行?

1 个答案:

答案 0 :(得分:1)

遗憾的是,您将旧的list-of-tables / WHERE id = id语法与更新且更有效的LEFT JOIN语法相结合。

 FROM member_home_address MH,  ...
      member_spouse_info MS ...
WHERE ... MH.Member_Id = MS.Member_Id

相当于INNER JOIN。因此,MS中缺席的记录会抑制整个结果集记录。

你想要这个

FROM member_master MM
LEFT JOIN member_payment_master MP ON MM.Member_Id = MP.Member_Id
LEFT JOIN member_mailing_title MT ON MM.Member_Id = MT.Member_Id
LEFT JOIN member_spouse_info MS ON MM.Member_Id = MS.Member_Id
LEFT JOIN member_home_address MH ON MM.Member_Id = MH.Member_Id
LEFT JOIN guest g ON g.Member_Id = MM.Member_Id
LEFT JOIN member_subcategory sca ON sca.SubCategory_Id = MM.Admiral_Type_Id
LEFT JOIN member_subcategory scr ON scr.SubCategory_Id = MM.Royalty_Type_Id
LEFT JOIN member_subcategory scp ON scp.SubCategory_Id = MM.Parent_Type_Id
LEFT JOIN member_subcategory scg ON scg.SubCategory_Id = MM.Guest_Type_Id

然后,摆脱这些WHERE子句。您已将它们移动到LEFT JOIN语法中。如果将它们保留在原位,则将LEFT JOIN操作转换为INNER JOIN操作。

AND MH.Member_Id = MP.Member_Id  /*delete these!*/
AND MH.Member_Id = MT.Member_Id
AND MP.Member_Id = MS.Member_Id
AND MP.Member_Id = MM.Member_Id

我使用member_master开始了这个连接列表,假设它实际上每个成员都包含一行,并且应该驱动其余的连接。

您的查询由于某些原因我不知道,根据member_home_address中的行选择行并驱动JOIN级联。你可能想尝试用

来驾驶它
WHERE MM.Member_ID IN (/*dirty great list of member ids*/)

代替。

如果我是你,我会通过连接表建立连接表来解决此查询问题。你是拥有这些数据的唯一人; StackOverflow无法帮助您找到丢失的记录。