当join不匹配时,MySql使用Join返回数据

时间:2017-06-19 09:59:09

标签: mysql

我有两张表,我从

中提取数据

ATM

[ID] [所有者] [平衡] [状态]

ATMAvatar

[ATMID] [头像] [管理员] [允许] [有限公司] [限于]

我当前的查询是

SELECT ATM . * , ATMAvatar.Avatar AS User, ATMAvatar.Admin, 
    ATMAvatar.Allowed, ATMAvatar.Limited, ATMAvatar.Limit,
    (SELECT COUNT( * ) FROM ATMAvatar WHERE ATMID =  '{SOME ATM ID}') AS UserCount
FROM ATM
JOIN ATMAvatar ON ATM.ID = ATMAvatar.ATMID
WHERE ATM.ID =  '{SOME ATM ID}'
AND ATMAvatar.Avatar =  '{SOME NAME}'

如果ATMAvatar和ATM都有相对的行,那么效果很好。我希望能够转换这个,这样如果找不到ATMAvatar行,仍然会为任何ATMAvatar列的某些默认值选择ATM。

例如

  • ID:d7dafb52-bc31-4f38-a433-7c273b345454
  • 所有者:Tom Hanson
  • 余额:0
  • 州:0
  • 用户:James McCrawford(从查询中获取此信息),因为该行不会返回
  • 管理员:0(行不可用,因此无法成为管理员)
  • 允许:0(行不可用,因此不允许)
  • 限制:1(行无法如此明确限制)
  • 限制:0(行不可用,因此限制为$ 0)
  • UserCount:15

如果它只是将行返回空,我会很高兴我可以在php中检查它。

修改 我的问题是我在一系列不包含他的行中搜索James McCrawford。我想我需要重新考虑查询的结构

2 个答案:

答案 0 :(得分:2)

您可以使用LEFT JOIN,例如:

SELECT ATM . * , ATMAvatar.Avatar AS User, ATMAvatar.Admin, 
    ATMAvatar.Allowed, ATMAvatar.Limited, ATMAvatar.Limit,
    (SELECT COUNT( * ) FROM ATMAvatar WHERE ATMID =  '{SOME ATM ID}') AS UserCount
FROM ATM
LEFT JOIN ATMAvatar ON ATM.ID = ATMAvatar.ATMID
WHERE ATM.ID =  '{SOME ATM ID}'
AND (ATMAvatar.Avatar =  '{SOME NAME}' OR ATMAvatar.Avatar IS NULL)

无论ATM中是否有匹配的记录,这都会返回ATMAvatar的所有记录。结果行中的所有ATMAvatar相关字段对null条记录为ATM,而不包含任何ATMAvatar

答案 1 :(得分:0)

试试这个:

SELECT ATM.*,
       ATMAvatar.Avatar AS User,
       ATMAvatar.Admin,
       ATMAvatar.Allowed,
       ATMAvatar.Limited,
       ATMAvatar.Limit,
       (    SELECT COUNT(*)
            FROM ATMAvatar 
            WHERE ATMID = '{SOME ATM ID}'
       ) AS UserCount
FROM ATM
JOIN ATMAvatar ON ATM.ID = ATMAvatar.ATMID 
                  AND ATMAvatar.Avatar = '{SOME NAME}'
WHERE ATM.ID = '{SOME ATM ID}'