选择表A中的所有记录,即使表B中没有一个或多个ID(即FK)

时间:2016-04-21 04:45:20

标签: mysql select join

首先,我知道标题听起来有点令人困惑,我很抱歉。我无法找到完全用句子表达自己的文字。

所以这就是我想要做的事情:

一个简单的搜索框,用户在其中输入名称并像谷歌一样获得自动提示。

我的第一个表('用户')是这样的:

  Table 'users':

   Id(PK)     name   email
    10        max    max@max.com
    20        john   john@john.com
    30        jack   jack@jack.com
    40        jill   jill@jill.com

第二张表格('图片')是这样的:

  Table 'pictures':

   Id    user_id(FK)   profilepic          iscurrent
    1    10            abc.jpg             1
    2    20            sds.jpg             0
    3    30            asdasd.jpg          1
    4    20            sdsdff.jpg          1

现在,当用户开始输入名称"joh"时,他会在建议中看到"john + john's email + john's picture"

这就是我现在实现它的方式:

SELECT users.name, users.email, pictures.profilepic
FROM pictures 
INNER JOIN users 
ON pictures.user_id=users.id 
WHERE pictures.is_current = 1 
AND users.name LIKE '%joh%' OR email LIKE '%joh%' 
ORDER BY users.id 
ASC LIMIT 5;

问题是它只选择在第二张表中有FK的记录('图片')

但我希望用户看到与他们输入的名称相匹配的所有记录,即使该用户没有个人资料图片。

希望你能理解这个问题。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您应该使用左连接而不是内连接,这将返回表中的所有行:users。即使用户没有图片,也会列出。

答案 1 :(得分:1)

您应该使用左连接而不是内连接从用户到图片进行选择。它应该是这样的:

SELECT users.name, users.email, pictures.profilepic
FROM users
LEFT JOIN pictures
ON pictures.user_id=users.id 
WHERE pictures.is_current = 1 
AND users.name LIKE '%joh%' OR email LIKE '%joh%' 
ORDER BY users.id ASC
LIMIT 5;

或者,你保持这样,但改为使用右连接。

SELECT users.name, users.email, pictures.profilepic
FROM pictures
RIGHT JOIN users
ON pictures.user_id=users.id 
WHERE pictures.is_current = 1 
AND users.name LIKE '%joh%' OR email LIKE '%joh%' 
ORDER BY users.id ASC
LIMIT 5;