Subquery (pembina pertanyaan 12)


Mula-mula bina SQL subquery Anda boleh menggunakan tiga kaedah berikut untuk membina subquery.

Gunakan kaedah fetchSql

kaedah fetchSql bermaksud tidak untuk bertanya tetapi hanya mengembalikan pernyataan SQL yang dibina, dan bukan sahaja menyokong pilih, tetapi menyokong semua pertanyaan CURD. Hasil subQuery yang dijana oleh

$subQuery = Db::table('think_user')
    ->field('id,name')
    ->where('id', '>', 10)
    ->fetchSql(true)
    ->select();

ialah:

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

Menggunakan buildSql untuk membina subquery

$subQuery = Db::table('think_user')
    ->field('id,name')
    ->where('id', '>', 10)
    ->buildSql();

Hasil subQuery yang dijana ialah:

( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )

Selepas operasi memanggil, kaedah buildSql bukan sahaja akan dijalankan. pertanyaan akan dijana Pernyataan SQL (untuk mengelakkan kekeliruan, kurungan akan ditambah pada kedua-dua belah SQL), dan kemudian kami memanggilnya secara langsung dalam pertanyaan berikutnya.

Kemudian gunakan subquery untuk membina pertanyaan baharu:

Db::table($subQuery . ' a')
    ->where('a.name', 'like', 'thinkphp')
    ->order('id', 'desc')
    ->select();

Pernyataan SQL yang dihasilkan ialah:

SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc

Gunakan penutupan untuk membina subquery

Soalan seperti IN/TIDAK ADA dan WUJUD secara langsung Penutupan sebagai subkueri, contohnya:

Db::table('think_user')
    ->where('id', 'IN', function ($query) {
        $query->table('think_profile')->where('status', 1)->field('id');
    })
    ->select();

Pernyataan SQL yang dijana ialah

SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
Db::table('think_user')
    ->whereExists(function ($query) {
        $query->table('think_profile')->where('status', 1);
    })->find();

Penyataan SQL yang dijana ialah

SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )

Selain syarat pertanyaan di atas, operasi perbandingan juga menyokong penggunaan subkueri penutupan