我有以下mysql选择。它获取了在事件上合格的用户列表,并且还从users表中获得了一些结果。
SELECT event.*,
users.first_name,
users.last_name,
users.login,
users.email,
users.f_phone as userphone,
users.f_phone_code
FROM event,
users
WHERE (users.id=event.h_user and f_code LIKE %NEW%)
OR event.h_user = -1
ORDER BY event.`h_id` DESC
一切都运作良好,直到我尝试通过h_user = -1
添加记录来获得更多结果。它们不是很多,但我猜我的查询不够好,而用户数据库真的很大。添加的OR
语句在获取结果时会使数据库崩溃。我试图在WHERE语句中添加括号,但它们没有帮助。
请你帮忙解决这个问题吗?
答案 0 :(得分:2)
这是因为当您在or
子句中添加where
时,隐式连接条件会变得混乱,因此查询无法按预期工作。尝试使用显式join
代替(你可以使查询双向工作,但显式表示法更具可读性)并将所有过滤保留在where
子句中:
from event
join users on users.id = event.h_user
where f_code like '%NEW%' or event.h_user = -1
使用隐式表示法看起来像这样(不要使用它,不推荐使用):
from event, users
where ( users.id = event.h_user ) and
( f_code like '%NEW%' or event.h_user = -1 )
答案 1 :(得分:0)
您也可以使用连接和UNION执行此操作:
SELECT event.*,
users.first_name,
users.last_name,
users.login,
users.email,
users.f_phone as userphone,
users.f_phone_code
FROM event
INNER JOIN users ON users.id=event.h_user
WHERE f_code LIKE %NEW%
UNION
SELECT event.*,
users.first_name,
users.last_name,
users.login,
users.email,
users.f_phone as userphone,
users.f_phone_code
FROM event
INNER JOIN users ON users.id=event.h_user
WHERE event.h_user = -1
ORDER BY event.`h_id` DESC