2011-08-31 143 views
3

为什么这个sql查询只显示结果,如果他们在users_warnings中只有一行?为什么我的查询没有返回任何结果?

SELECT 
u.id, 
uw.warning 
FROM 
users u 
INNER JOIN users_warnings uw ON (
    u.id = uw.uID 
) 
LIMIT 21 

我想如果有的话,以显示所有的用户,而且还抢在users_warnings列“警告”。

回答

6

如果两个表中都有数据,则INNER JOIN将返回一些内容。
尝试LEFT JOIN代替:

SELECT u.id, uw.warning FROM users u 
      LEFT JOIN users_warnings uw ON (u.id = uw.uID) 
      LIMIT 21 
+0

这更像是你想要的而不是外连接 – kralco626

6

因为您使用的是inner join,这需要连接表上存在一行。请尝试以下操作:

SELECT 
u.id, 
uw.warning 
FROM 
users u 
LEFT JOIN users_warnings uw ON (
    u.id = uw.uID 
) 
LIMIT 21 
2

改变你内心的加盟,左连接,像这样:

SELECT u.id, uw.warning FROM users u 
       LEFT JOIN users_warnings uw ON (u.id = uw.uID) 
       LIMIT 21 
1
SELECT 
    u.id, 
    IFNULL(uw.warning,'') warning 
FROM 
    (SELECT id FROM users LIMIT 21) u 
    LEFT JOIN users_warnings uw 
    ON u.id = uw.uID 
; 
  • 应该是一个LEFT JOIN不INNER JOIN
  • 重构在尝试JOIN之前获取前21个用户的查询(更快的查询)
  • 默认警告为空字符串,如果用户没有警告