当两个表中都不存在数据时,查询不返回任何结果

时间:2019-02-10 18:10:06

标签: mysql mysqli

所以,我有两个桌子。用户包含基本用户信息,而user_address包含用户地址”。很简单。

我有一个搜索表单,可以查找用户。一个搜索字段使用LIKE搜索多列。 它允许用户被他们的...所吸引。

公司名称(在用户表下列出) 名称(在用户地址表下列出) 电子邮件地址(用户地址表) 电话1(用户地址表) 电话2(用户地址表)

该表单触发一个Ajax,该Ajax通过$ _POST将搜索值传递到搜索页面。

然后从$ _POST分配$ value并进行过滤,然后将其传递到mysql查询。

在正常情况下,该用户同时存在并且该用户存在地址,下面的查询可以完美地工作。

问题是,有时将“用户”添加到数据库时,不会立即输入地址。在这种情况下,尝试搜索用户时,找不到该用户。

我需要它来查找用户是否输入了地址。我尝试了JOIN,LEFT JOIN,RIGHT JOIN,INNER JOIN等。似乎没有任何作用。出于某种原因,左联接会降低查询速度,并在触发查询时使页面陷入困境。

"SELECT u.id,u.company,a.name as address_name
FROM Users as u 
JOIN User_Address as a ON a.user_id = u.id 
WHERE a.name LIKE '%$value%' OR u.company LIKE '%$value%' OR a.email LIKE '%$value%' OR a.phone_1 LIKE '%$value%' OR a.phone_2 LIKE '%$value%' GROUP BY u.id”

同样,搜索问题是用户表中存在一个用户,但用户地址表中不存在该用户的地址。

1 个答案:

答案 0 :(得分:0)

您的查询有些棘手,因为如果我理解正确,即使匹配项仅在用户中,您也希望拥有用户和地址。这就是为什么我会将匹配项放入子查询中。这也将极大地提高性能。

SELECT Users.id, Users.company, User_Address.name AS address_name
FROM (
  SELECT id AS user_id FROM Users WHERE u.company LIKE '%$value%'
  UNION
  SELECT user_id
  FROM User_Address
  WHERE a.name LIKE '%$value%'
  OR a.email LIKE '%$value%'
  OR a.phone_1 LIKE '%$value%'
  OR a.phone_2 LIKE '%$value%'
) AS matches
JOIN Users ON Users.user_id = matches.user_id
LEFT JOIN User_Address ON User_Address.user_id = Users.id
GROUP BY u.id

顺便说一句,LIKE '%$value%'好像您正在使用字符串插值法来构建查询。这可能是不安全的。确保正确地转义了您的值,并且了解各种危险和替代方法(例如使用参数绑定库)。