所以,我有两个桌子。用户包含基本用户信息,而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”
同样,搜索问题是用户表中存在一个用户,但用户地址表中不存在该用户的地址。
答案 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%'
好像您正在使用字符串插值法来构建查询。这可能是不安全的。确保正确地转义了您的值,并且了解各种危险和替代方法(例如使用参数绑定库)。