LEFT JOIN在' on子句中返回非唯一表/别名和未知列

时间:2016-02-24 08:03:37

标签: php mysql join

我有一个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'在条款'。

为什么它不起作用?

3 个答案:

答案 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."%'
    ";