مرحبًا، استخدم هذا الاستعلام في وحدة التحكم الخاصة بي ويعمل، يعرض هذا الاستعلام بيانات التوزيع اليومي للقيم التي تم تصفيتها باستخدام نموذج،، وذلك قابل للتعديل لأنه عندما لا تُعين بعض معلمات التصفية، فإنني لا استخدمها في استعلامي.
$query = Measure::query()
->select(DB::raw('DATEPART(hour, DATETIME_D) AS HOUR_N'))
->selectRaw('SUM(CASE WHEN STATUS_N > 0 THEN 1 ELSE 0 END) AS OK_N')
->selectRaw('SUM(CASE WHEN STATUS_N <= 0 THEN 1 ELSE 0 END) AS NOK_N')
->where('MEASUREID_N', '>', 0)
->where('DATETIME_D', '>=', $dfrom)
->where('DATETIME_D', '<=', $dto);
$query->when($serial_number, function (Builder $q, string $serial_number) {
$q->where('PRODSN_S', '=', $serial_number);
});
$query->when($user_id, function (Builder $q, string $user_id) {
$q->where('USERID_S', '=', $user_id);
});
$query->when($product_id, function (Builder $q, string $product_id) {
$q->where('PRODID_S', 'LIKE', '%' . $product_id . '%');
});
$query->when($area, function (Builder $q, string $area) {
$q->join('AREAS_DEF', 'MEASURES.AREAID_N', '=', 'AREAS_DEF.AREAID_N')
->where('AREAS_DEF.NAME_S', '=', $area);
});
$query->when($phase, function (Builder $q, string $phase) {
$q->join('PHASES_DEF', 'MEASURES.PHASEID_N', '=', 'PHASES_DEF.PHASEID_N')
->where('PHASES_DEF.NAME_S', 'LIKE', '%' . $phase . '%');
});
$query->groupBy(DB::raw('DATEPART(hour, DATETIME_D)'))
->orderBy(DB::raw('DATEPART(hour, DATETIME_D)'));
ذلك يعمل بشكل جيد وبسرعة.
ولكن عندما استخدم نفس الاستعلام مع بعض المعلمات المختلفة التي تعيد توزيعًا أسبوعيًا، لا يتم حل الاستعلام ويبدو أنه معلق ومجمد، وهذا هو الاستعلام:
$query = Measure::query()
->select(DB::raw('DATEPART(dw, DATETIME_D) AS DAY_N'))
->selectRaw('SUM(CASE WHEN STATUS_N > 0 THEN 1 ELSE 0 END) AS OK_N')
->selectRaw('SUM(CASE WHEN STATUS_N <= 0 THEN 1 ELSE 0 END) AS NOK_N')
->where('MEASUREID_N', '>', 0)
->where('DATETIME_D', '>=', $dfrom)
->where('DATETIME_D', '<=', $dto);
$query->when($serial_number, function (Builder $q, string $serial_number) {
$q->where('PRODSN_S', '=', $serial_number);
});
$query->when($user_id, function (Builder $q, string $user_id) {
$q->where('USERID_S', '=', $user_id);
});
$query->when($product_id, function (Builder $q, string $product_id) {
$q->where('PRODID_S', 'LIKE', '%' . $product_id . '%');
});
$query->when($area, function (Builder $q, string $area) {
$q->join('AREAS_DEF', 'MEASURES.AREAID_N', '=', 'AREAS_DEF.AREAID_N')
->where('AREAS_DEF.NAME_S', '=', $area);
});
$query->when($phase, function (Builder $q, string $phase) {
$q->join('PHASES_DEF', 'MEASURES.PHASEID_N', '=', 'PHASES_DEF.PHASEID_N')
->where('PHASES_DEF.NAME_S', 'LIKE', '%' . $phase . '%');
});
$query->groupBy(DB::raw('DATEPART(dw, DATETIME_D)'))
->orderBy(DB::raw('DATEPART(dw, DATETIME_D)'));
حاولت إزالة معلمات 'LIKE' وتعيين '=' بدلاً منها وأصبح الأمر سريعًا، وهذا غريب لأن عندما أجرب الاستعلام في SQL Manager، يكون سريعًا وبدون أخطاء، لقد واجهت تلك المشكلة بالفعل مع استعلامات أخرى كان فيها التطابق الجزئي.
هل واجه أحدكم مشاكل مماثلة من قبل؟