mysql "or" 查询操作顺序
Posted
技术标签:
【中文标题】mysql "or" 查询操作顺序【英文标题】:mysql "or" order of query operations 【发布时间】:2013-12-09 19:03:03 【问题描述】:所以我正在使用 laravel 3,它在 mysql 数据库上使用 eloquent ORM。我有一个函数可以重复往返 SQL 服务器,并且我已经让它与我有限的测试用例一起工作,但我不能 100% 确定 sql 查询中的操作顺序,所以我是希望有人能给我一个想法,如果我是正确的。旧代码如下
$notifications = Notification::where(condition-1-a)->where(condition-1-b)->get();
foreach ($locations = DB::table(table)->where(propertyX)->get() as $location)
$extra_notifications = Notification::where(condition-2-a)->where(condition-2-b)->get();
$notifications = array_merge($notifications,$extra_notifications);
我知道上面的代码可以工作,并且保持隔离,因为每个查询都作为它自己的实体运行,然后结果被合并,但是一旦你开始获得更多的位置,它需要很长时间才能运行。我试图通过只访问一次 sql server 来减少这种情况,并提出了这段代码。
$notifications = Notification::where(condition-1-a)->where(condition-1-b);
foreach ($locations = DB::table(table)->where(propertyX)->get() as $location)
$notifications = $notifications -> or_where(condition-2-a)->where(condition-2-b);
$notifications = $notifications->get();
我的问题是我不确定 or_where 是如何工作的。它会生成一个 sql 字符串,其中包含我熟悉的单词作为代码,但我不确定它们是否会以相同的方式工作。生成的字符串是
SELECT * FROM `notifications`
WHERE `condition-1-a` = ? AND `condition-1-b` = ?
OR `condition-2-a` = ? AND `condition-2-b` = ?
OR `condition-2-a` = ? AND `condition-2-b` = ?
OR `condition-2-a` = ? AND `condition-2-b` = ?
... (etc depending on number of loop iterations)
我要查找的主要内容是确认查询的运行方式。我可以期望这样运行吗?
SELECT * FROM `notifications`
WHERE (`condition-1-a` = ? AND `condition-1-b` = ?)
OR (`condition-2-a` = ? AND `condition-2-b` = ? )
OR (`condition-2-a` = ? AND `condition-2-b` = ? )
OR (`condition-2-a` = ? AND `condition-2-b` = ? )
... [etc depending on number of loop iterations]
或者是否有其他一些 sql 语句的评估顺序?
(我编辑了一些变量名和代码的其他方面,我尽我所能将其归结为每个人都可以使用的东西,这样它就不是特定于我的情况)
【问题讨论】:
【参考方案1】:MySQL operator precedence
AND
的优先级高于OR
。您的第一个示例与您的第二个示例相同。
【讨论】:
以上是关于mysql "or" 查询操作顺序的主要内容,如果未能解决你的问题,请参考以下文章
MySQL "tinyInt1isBit or tinyint" 相关问题解析
在 MySql 查询中替换“OR EXISTS”,这样我可以获得更好的性能结果