it-swarm-vi.com

"Ở ĐÂU KHÔNG Ở (CHỌN ...)" với SelectQuery?

Có thể thêm mệnh đề WHERE NOT IN (SELECT...) vào một đối tượng SelectQuery không? Tôi đã xem xét SelectQuery :: condition () và dường như không cho phép cú pháp này:

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

Nó dường như chỉ cho phép các biểu thức so sánh giá trị. Có một phương pháp khác cung cấp cú pháp này?

Tôi đang xem xét các điều kiện theo thứ tự hàng ngàn giá trị, vì vậy có vẻ không hiệu quả khi có một bó AND value <> x điều kiện.

6
user1359

Những gì bạn đang tìm kiếm là SelectQuery :: tồn tại () , thật không may, nó dường như không hoạt động với "cách chung" để xây dựng mệnh đề đó:
[.__.] Thông thường trong mệnh đề EXISTS bạn đặt THAM GIA trên các bảng bên ngoài truy vấn phụ của bạn như thế này:

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

Điều này trả về các nút của người dùng bị chặn (vâng, nó có thể được xây dựng dễ dàng mà không cần EXISTS nhưng nó dành cho mục đích giảng dạy;).

Vấn đề ở đây là điều kiện exists không hỗ trợ "liên kết ngoài", u.uid = n.uid một phần để bạn phải xây dựng một truy vấn hoàn toàn độc lập mà IMHO không hiệu quả lắm.
[.__.] Trong Drupal bạn sẽ viết cái này:

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

Bạn cũng có thể sử dụng db_query () giống như bạn đã từng làm trong Drupal 6 và tất nhiên ChọnQuery :: notExists () khả dụng.

8
tostinni

Một cách dễ dàng hơn để sử dụng db_select với phần phụ KHÔNG IN chỉ là sử dụng

$ truy vấn-> ở đâ

để thêm một tùy ý nơi điều kiện.

ví dụ:

  // 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

Về mặt thực tế, bạn có thể sử dụng SelectQuery :: condition () để tạo các mục phụ như vậy:

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

Nếu chúng ta in truy vấn này bằng hàm dpq () của devel thì nó sẽ xuất ra:

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

Tôi hi vọng cái này giúp được ;-)

2
Jelle

Tôi tin rằng điều này sẽ giúp bạn.

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