Apa cara yang tepat untuk menulis kueri yang berisi 'TIDAK DI' menggunakan pernyataan kondisi?
Permintaan saya adalah sebagai berikut:
SELECT DISTINCT nid FROM node WHERE language NOT IN
(SELECT language
FROM languages WHERE language = 'ab');
Saya sudah mencoba sesuatu seperti berikut:
$query->condition('n.' . $key, $value, 'not in (select language from
languages where language = $value)');
SELECT nid FROM node WHERE language != 'ab'
?Jawaban:
Dalam contoh spesifik, Anda cukup menuliskan kondisinya sebagai:
Dalam kasus umum, di mana Anda harus memilih baris dalam basis data berdasarkan nilai yang dikembalikan dari sub-kueri, Anda harus mempertimbangkan apa yang berikut:
"NOT IN" diterima sebagai operator dari
SelectQuery::condition()
. Bahkan, permintaan berikut akan dieksekusi:Seperti yang dilaporkan dalam klausa Bersyarat ("Subselects"),
SelectQuery::condition()
menerima juga objek yang mengimplementasikanSelectQueryInterface
sebagai nilai untuk$value
, seperti yang dikembalikan olehdb_select()
; masalahnya adalah bahwa sebenarnya Anda bisa menggunakannya ketika nilai$operator
sama dengan"IN"
. Lihat Subselek tidak berfungsi dalam kondisi DBTNG, kecuali bila digunakan sebagai nilai untuk IN .Satu-satunya cara saya dapat melihat untuk menggunakan operator "TIDAK DALAM" dengan sub-kueri
condition
adalah dengan:Jalankan query utama yang mengatur kondisi seperti pada cuplikan berikut
$subquery_result
adalah array yang berisi hasil dari sub-query.Jika tidak, Anda bisa menggunakan
where()
seperti kata orang lain, yang menerima string untuk bagian dari kueri yang perlu Anda tambahkan.Ingatlah bahwa
db_select()
itu lebih lambatdb_query()
; Anda harus menggunakan yang pertama saat Anda tahu kueri dapat diubah oleh modul lain. Jika tidak, jika modul lain tidak seharusnya digunakanhook_query_alter()
untuk mengubah kueri Anda, Anda harus menggunakandb_query()
.Dalam hal mengakses node, jika Anda hanya perlu mendapatkan node yang dapat diakses oleh pengguna, maka Anda harus menggunakan
db_select()
dan menambahkan'node_access'
sebagai tag kueri, denganSelectQuery::addTag()
. Misalnya,blog_page_last()
gunakan kode berikut.Kode serupa digunakan oleh
book_block_view()
.sumber
Saat menulis query yang kompleks Anda pasti harus menggunakan
db_query()
bukandb_select()
.NOT IN
klausa dengan subquery dengan API database Drupal saat ini (ini adalah masalah yang diketahui sedang dikerjakan).db_select()
.db_query()
.Mengenai kueri Anda, saya tidak yakin mengapa Anda ingin menggunakan subquery (kecuali Anda menyederhanakan contoh Anda)? Anda dapat menulisnya dengan mudah seperti ini:
DISTINCT
tidak diperlukan sepertinid
kunci primer sehingga tidak akan diduplikasi.sumber
Ada juga where () yang memungkinkan untuk menambahkan kondisi arbitrary where ke kueri.
Contoh:
Seperti yang disebutkan oleh keithm, Anda harus menggunakan db_select () dan addTag ('node_access') ketika memilih node yang kemudian ditampilkan kepada pengguna.
sumber
Cara yang lebih mudah untuk menggunakan db_select dengan subselect NOT IN hanya menggunakan sedikit yang diketahui
$ query-> di mana
untuk menambahkan kondisi tempat sewenang-wenang.
misalnya:
sumber
Di mana $ subquery_values adalah larik format $ key => $ nid sebagai hasil dari subquery
ini bekerja dengan baik.
sumber