组合和/或语句崩溃数据库

时间:2016-10-27 21:08:20

标签: mysql sql

我有以下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语句中添加括号,但它们没有帮助。

请你帮忙解决这个问题吗?

2 个答案:

答案 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