我有一个PHP网站,其中的表格通过带有输入框的表格从MySQL数据库打印出搜索结果。我使用这种SQL语法,它工作正常。我可以在一个字段中搜索以从location.room_name和users.user_name:
获取结果选择
$searchCriterias =
"WHERE
location.room_name LIKE '%".$s."%' OR
users.user_name LIKE '%".$s."%'
";
其中:
$s
LEFT JOIN users ON computers.user_2 = users.id
是搜索表单中的字符串。
问题是我有计算机.user_1,computers.user_2和computers.user_3,它们都与上面的语法中的users.id相对应。当我搜索用户名时,我希望将其与user_1,user_2和user_3匹配,但我无法使用它。我只能将它与一个匹配(在本例中为user_1)。
我尝试添加LEFT JOIN users AS u1 ON computers.user_1 = users.id
并收到以下错误消息:不是唯一的表/别名:'用户'
和...
{{1}}这三个人都得到了这个消息:未知栏' users.id'在条款'。
为什么它不起作用?
答案 0 :(得分:1)
正如您所说,computers
表中有3列,请在加入时尝试关注。还添加了GROUP BY
以获得每位用户的唯一结果。
$query = "SELECT computers.*, location.room_name AS location
FROM computers
LEFT JOIN location ON computers.location = location.id
LEFT JOIN users ON (computers.user_1 = users.id
OR computers.user_2 = users.id
OR computers.user_3 = users.id ) ".
$searchCriterias . " GROUP BY users.id ORDER BY id";
答案 1 :(得分:1)
将您的ON条件更改为IN语句:
SELECT computers.*, location.room_name AS location
FROM computers
LEFT JOIN location ON computers.location = location.id
LEFT JOIN users
ON ((users.id = computers.user_1) or
(users.id =computer.user_2 and not exists(select 1 from users t where t.id = computers.user_1)) OR
(users.id = computer.user_3 AND not exists(select 1 from users p where p.id IN(computer.user_2,computer.user_1))))".
" ".$searchCriterias."
ORDER BY id
答案 2 :(得分:0)
另一种选择是连接用户3次,并修改你的WHERE子句以检查3个不同的表。
可能需要DISTINCT来删除重复项,因为我认为名称可以多次匹配。
这比在ON子句中使用OR还有优势,它仍然可以使用索引进行连接。
SELECT computers.*, location.room_name AS location
FROM computers
LEFT JOIN location ON computers.location = location.id
LEFT JOIN users users1 ON computers.user_1 = users1.id
LEFT JOIN users users2 ON computers.user_2 = users2.id
LEFT JOIN users users3 ON computers.user_3 = users3.id".
" ".$searchCriterias."
ORDER BY id
WHERE子句
$searchCriterias =
"WHERE
location.room_name LIKE '%".$s."%' OR
users1.user_name LIKE '%".$s."%' OR
users2.user_name LIKE '%".$s."%' OR
users3.user_name LIKE '%".$s."%'
";