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

Mysql 当两个表中都不存在数据时,查询不返回结果,mysql,Mysql,我有两张桌子。用户包含基本用户信息,用户地址包含“用户地址”。非常直截了当 我有一个允许用户查找的搜索表单。一个搜索字段使用LIKE搜索多个列。 它允许用户通过他们的 公司名称(列在用户表下) 名称(列在用户地址表下) 电子邮件地址(用户地址表) 电话1(用户地址表) 电话2(用户地址表) 表单触发Ajax,Ajax通过$\u POST将搜索值传递给搜索页面 $value然后从$\u POST分配,并进行过滤,然后传递给mysql查询 在用户和地址都存在的正常情况下,下面的查询非常有效 问题是,

我有两张桌子。用户包含基本用户信息,用户地址包含“用户地址”。非常直截了当

我有一个允许用户查找的搜索表单。一个搜索字段使用LIKE搜索多个列。 它允许用户通过他们的

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

表单触发Ajax,Ajax通过$\u POST将搜索值传递给搜索页面

$value然后从$\u POST分配,并进行过滤,然后传递给mysql查询

在用户和地址都存在的正常情况下,下面的查询非常有效

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

我需要它来查找用户是否输入了地址。我试过连接、左连接、右连接、内部连接等。似乎没有任何效果。由于某种原因,左连接会减慢查询速度,当查询被触发时,页面会陷入困境

"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”

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

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

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

顺便说一下,类似“%$value%”的
看起来像是在使用字符串插值来构建查询。这可能是不安全的。确保正确转义您的值,并且您了解危险和备选方案(如使用参数绑定库)。

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

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

顺便说一下,类似“%$value%”的
看起来像是在使用字符串插值来构建查询。这可能是不安全的。确保正确转义您的值,并且您了解这些危险和备选方案(如使用参数绑定库)。

这些值是转义的,仅供内部使用。我很快就会试试这个。谢谢但事实并非如此。它仍然以相同的方式搜索。对不起,在复制粘贴时忘记了“左”。编辑好了,效果很好。你能解释一下为什么要这样设置吗?我想了解其中的区别。我对原始查询做了两个更改:1)将匹配项移动到子查询中。仔细想想,你会发现原因:如果你通过
u.company
匹配一个用户,但你仍然想查询
地址\u name
,你需要先进行匹配,然后再读取地址-这就是子查询的作用。我还选择在子查询中使用UNION而不是LEFT JOIN。这只是因为在这种情况下,实际的连接将是不必要的开销-我们只需要匹配的
user\u id
s。它们被转义,并且仅用于内部使用。我很快就会试试这个。谢谢但事实并非如此。它仍然以相同的方式搜索。对不起,在复制粘贴时忘记了“左”。编辑好了,效果很好。你能解释一下为什么要这样设置吗?我想了解其中的区别。我对原始查询做了两个更改:1)将匹配项移动到子查询中。仔细想想,你会发现原因:如果你通过
u.company
匹配一个用户,但你仍然想查询
地址\u name
,你需要先进行匹配,然后再读取地址-这就是子查询的作用。我还选择在子查询中使用UNION而不是LEFT JOIN。这只是因为在这种情况下,实际的连接将是不必要的开销-我们只需要匹配的
user\u id
s。