هل من الممكن إضافة جملة WHERE NOT IN (SELECT...)
إلى كائن SelectQuery
؟ كنت أنظر إلى SelectQuery :: condition () ، ولا يبدو أنها تسمح بهذه البنية:
public SelectQuery::condition($field, $value = NULL, $operator = NULL)
يبدو فقط أنه يسمح بتعابير مقارنة القيمة. هل هناك طريقة أخرى توفر هذه البنية؟
أنا أنظر إلى الشروط المتعلقة بترتيب آلاف القيم ، لذا يبدو من غير الفعال أن يكون لديك مجموعة من AND value <> x
الظروف.
ما تبحث عنه هو SelectQuery :: موجود () ، للأسف لا يبدو أنه يعمل مع "طريقة شائعة" لبناء مثل هذه الفقرة:
عادة في _EXISTS
عبارة تضع JOIN على جداول خارج الاستعلام الفرعي الخاص بك مثل هذا:
SELECT n.nid
FROM node n
WHERE EXISTS (
SELECT NULL
FROM users u
WHERE u.uid = n.uid
AND u.status = 0)
هذا يعيد عقد المستخدمين المحظورين (نعم يمكن بناؤه بسهولة بدون EXISTS
ولكنه لأغراض التدريس ؛).
تكمن المشكلة هنا في أن شرط exists
لا يدعم "الربط الخارجي" ، الجزء u.uid = n.uid
، لذا عليك إنشاء استعلام مستقل تمامًا ليس فعالًا للغاية IMHO.
في Drupal ستكتب التالي:
$query = db_select('node', 'n')
->fields('n', array('nid'));
$subquery = db_select('node', 'n2')
->fields('n2', array('nid'))
->join('users', 'u', 'n2.uid = u.uid'
->condition('u.status', 0);
$query->condition('', $subquery, 'EXISTS');
$result = $query->execute();
يمكنك أيضًا استخدام db_query () مثلما كنت تفعل في Drupal 6 وبالطبع SelectQuery :: notExists () متاح.
أسهل طريقة لاستخدام db_select مع تحديد IN IN الفرعي هي الاستخدام فقط
لإضافة تعسفي حيث الشرط.
على سبيل المثال:
// Count query for users without rid 3
$query = db_select('users', 'u');
$query->fields('u', array('uid'));
$query->where('u.uid NOT IN(select uid from {users_roles} where rid = :rid)', array(':rid' => 3));
$result = $query->countQuery()->execute()->fetchField();
drupal_set_message($result);
حقًا ، يمكنك يمكنك استخدام SelectQuery :: condition () لإنشاء اختيارات فرعية مثل:
$query = db_select('users', 'u')
->fields('u', array('uid'))
->condition('u.uid', db_select('users_roles', 'r')->fields('r', array('uid')), 'NOT IN');
إذا قمنا بطباعة هذا الاستعلام باستخدام وظيفة dpq () من devel ، فسيتم إخراج:
SELECT u.uid AS uid
FROM
{users} u
WHERE (u.uid NOT IN (SELECT r.uid AS uid
FROM
{users_roles} r))
آمل أن يساعد هذا ؛-)
أعتقد أن هذا سيساعدك.
$query->where('n.nid NOT IN (:nids)', array(
':nids' => implode(',', $nids)
));