【发布时间】:2018-09-29 09:33:43
【问题描述】:
我有一个列名为firmware_flash_result 的表,它要么失败要么通过。 查询生成器为 Pass 返回正确的结果,但对于失败则返回错误的结果。
实际查询和结果:
SELECT COUNT(DISTINCT `payment_module_id`)
FROM `payment_prod_pograms`
WHERE `created_at` >= "2018-09-17 00:00:00" AND
(
`payment_module_id` LIKE "PB10____18____" OR
`payment_module_id` LIKE "PM10____18____"
) AND
CHAR_LENGTH(`payment_module_id`) = 14 AND
`firmware_flash_result` = "FAIL";
+-------------------------------------+
| COUNT(DISTINCT `payment_module_id`) |
+-------------------------------------+
| 0 |
+-------------------------------------+
Laravel 查询构建器:
$payment_prod_failed_test = DB::table('payment_prod_pograms')
->where('created_at','>=','2018-09-17 00:00:00')
->whereRaw('char_length(payment_module_id) = 14')
->where('payment_module_id','like','%PB10____18____%')
->orWhere('payment_module_id','like','%PM10____18____%')
->where('firmware_flash_result','=','FAIL')
->distinct()
->count('payment_module_id');
上述查询返回的结果是 453,这是不可能的。
经过一些调试我发现:
->orWhere('payment_module_id','like','%PM10____18____%')
为什么会导致这个错误?
数据库中有 1515 个条目,它们都通过了,但是这个查询返回了不同的结果.. 我在这里做错了什么? 任何帮助将不胜感激
【问题讨论】:
-
您有多个条件,其中一个是
orWhere('payment_module_id','like','%PM10____18____%'),我猜它没有像您的 SQL 示例中那样用()包裹,但您会得到查询: -
但是同样的查询在 mysql 中运行良好 ...
-
它们不一样:
SELECT COUNT(DISTINCT payment_module_id) FROM payment_prod_pograms where created_at > '2018-09-17 00:00:00' AND payment_module_id LIKE '%PB10____18____%' OR payment_module_id LIKE '%PM10____18____%' AND CHAR_LENGTH(payment_module_id) = 14 AND firmware_flash_result = 'FAIL';你的ORM版本缺少()围绕OR条件加上缺少% -
@LukaszSzozda 我改了,但结果还是一样。我猜顺序没关系
标签: mysql laravel-5.6 laravel-query-builder