mysql“或”查询操作的顺序

时间:2013-12-09 19:03:03

标签: php mysql laravel query-optimization eloquent

所以我正在使用laravel 3,它在mysql数据库上使用雄辩的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 个答案:

答案 0 :(得分:2)

MySQL operator precedence

AND的优先级高于OR。你的第一个例子与你的第二个例子相同。