首先,我知道标题听起来有点令人困惑,我很抱歉。我无法找到完全用句子表达自己的文字。
所以这就是我想要做的事情:
一个简单的搜索框,用户在其中输入名称并像谷歌一样获得自动提示。
我的第一个表('用户')是这样的:
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的记录('图片')
但我希望用户看到与他们输入的名称相匹配的所有记录,即使该用户没有个人资料图片。
希望你能理解这个问题。 提前谢谢。
答案 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;