【问题标题】:Query returns no results when data does not exist in both tables当两个表中都不存在数据时查询不返回结果
【发布时间】:2019-02-10 18:10:05
【问题描述】:

所以,我有两张桌子。 users 包含基本用户信息,user_address 包含用户地址。非常直接。

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

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

表单触发 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”

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    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%' 看起来您正在使用字符串插值来构建查询。这可能是不安全的。确保您的值已正确转义,并且您了解危险和替代方法(例如使用参数绑定库)。

    【讨论】:

    • 它们被转义,仅供内部使用。我很快就会试试这个。谢谢!
    • 那没有做到。它仍然以相同的方式搜索。
    • 抱歉,复制粘贴时忘记了“LEFT”。已编辑。
    • 效果很好。你能解释一下为什么要这样设置吗?我想了解其中的区别。
    • 我对您的原始查询进行了两处更改:1)将匹配移动到子查询中。如果您考虑一下,您会明白原因:如果您通过u.company 匹配用户,但您仍想查询address_name,则您需要先进行匹配,然后再读取地址 - 这就是子查询确实如此。我还选择在子查询中使用 UNION 而不是 LEFT JOIN。这只是因为在这种情况下实际加入是不必要的开销——我们只想要匹配的user_ids。
    猜你喜欢
    • 2020-09-09
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多