web-gelistirme-sc.com

SelectQuery ile "NEREDE (SEÇ ...)"?

SelectQuery nesnesine WHERE NOT IN (SELECT...) yantümcesi eklemek mümkün müdür? SelectQuery :: condition () bakıyordum ve bu sözdizimi için izin vermiyor gibi görünüyor:

public SelectQuery::condition($field, $value = NULL, $operator = NULL)

Yalnızca değer karşılaştırma ifadelerine izin veriyor gibi görünüyor. Bu sözdizimini sağlayan başka bir yöntem var mı?

Ben binlerce değer sırasına koşullara bakıyorum, bu yüzden bir grup AND value <> x Koşullara sahip olmak verimsiz görünüyor.

6
user1359

Aradığınız şey SelectQuery :: exist () , ne yazık ki böyle bir madde oluşturmak için "ortak yol" ile çalışmıyor gibi görünüyor:
Normalde EXISTS yan tümcesinde alt sorgunuzun dışındaki tablolara şöyle bir JOIN koyarsınız:

SELECT n.nid
FROM node n
WHERE EXISTS (
  SELECT NULL
  FROM users u
  WHERE u.uid = n.uid
  AND u.status = 0)

Bu, engellenen kullanıcıların düğümlerini döndürür (evet EXISTS olmadan kolayca oluşturulabilir, ancak öğretim amaçlıdır;).

Buradaki sorun exists koşulunun "dış bağlantıyı" desteklememesi, u.uid = n.uid parçası böylece IMHO çok verimli olmayan tamamen bağımsız bir sorgu oluşturmak zorunda.
Drupal bunu yazacaksınız:

$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();

Ayrıca Drupal 6 ve tabii ki SelectQuery :: notExists () içinde yaptığınız gibi db_query () kullanabilirsiniz.

8
tostinni

NOT IN alt seçimiyle db_select kullanmanın daha kolay bir yolu sadece kullanmaktır

$ query-> yerde

keyfi bir durum eklemek için.

örneğ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);
2
David Thomas

Aslında, şu şekilde alt seçimler oluşturmak için SelectQuery :: condition () kullanabilirsiniz:

$query = db_select('users', 'u')
  ->fields('u', array('uid'))
  ->condition('u.uid', db_select('users_roles', 'r')->fields('r', array('uid')), 'NOT IN');

Bu sorguyu devel'in dpq () işlevini kullanarak yazdırırsak çıktı alır:

SELECT u.uid AS uid
FROM 
{users} u
WHERE  (u.uid NOT IN  (SELECT r.uid AS uid
FROM 
{users_roles} r))

Umarım bu yardımcı olur ;-)

2
Jelle

Bunun sana yardım edeceğine inanıyorum.

$query->where('n.nid NOT IN (:nids)', array(
    ':nids' => implode(',', $nids)
));
0
Vlad Stratulat