首先,我知道标题听起来有点混乱,对此我很抱歉。我找不到词语来准确地用一句话表达自己。
所以这就是我要做的:
一个简单的搜索框,用户在其中输入名称并获得自动建议,就像在谷歌中一样。
我的第一个表("用户")是这样的:
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 的记录("图片")
但我希望用户看到与他们输入的名称匹配的所有记录,即使该用户没有个人资料图片。
希望你已经理解了这个问题。提前谢谢。
您应该使用左联接而不是内部联接从用户到图片中进行选择。它应该看起来像这样:
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;
您应该使用左连接而不是内部连接,这将返回表中的所有行:users。即使用户没有图片也会列出。