2017-06-19 63 views
2

我有两个表,我是从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行无法找到的情况下,ATM仍然会被选定为任何ATMAvatar列的默认值。

对于实施例

  • ID:d7dafb52-bc31-4f38-a433-7c273b345454
  • 拥有者:汤姆汉森
  • 余额:
  • 状态:0
  • 用户:詹姆斯McCrawford(从查询中获得)作为行不会返回
  • 管理员:0(行不可用,所以不能成为管理员)
  • 允许:0(行不可用,因此不能被允许)
  • 有限公司:1(行不可用,因此肯定限制)
  • 限制:0(行不可用,因此仅限于$ 0)
  • USERCOUNT位:15

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

编辑 我的问题是我搜索詹姆斯麦克劳福德在选择不包含他的行。我想我需要重新考虑查询的结构

+0

James McCrawford的ATMID是什么?和par UserCount一样,ATMAvatar表中有15条记录(ID:d7dafb52-bc31-4f38-a433-7c273b345454)。 – Conqueror

+0

这个例子中的信息都是模拟信息。只是一个例子。 James McCrawford是试图使用ATM的人的名字。数据库中没有atm这个名字。 –

回答

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}' 
+0

不幸的是,但是,谢谢:( –

+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

+0

没有运气。ATMAvatar.Avatar是ATMAvatar联合主键ATMID –

+0

我意识到问题是我选择所有行,那么WHERE子句是Avatar =“James McCrawford”,但在选择中没有James McCrawford –

+0

@TomHanson我们在查询中有'ATMAvatar.Avatar ='{SOME NAME}',因此它不会选择只存在于'ATM'中的记录,因为它们将不具有对应的'ATMAvatar'。 –