Unterabfrage (Abfrage-Generator 12)


Erstellen Sie zunächst die SQL-Unterabfrage. Sie können die folgenden drei Methoden verwenden, um die Unterabfrage zu erstellen.

Verwenden Sie die fetchSql-Methode

Die fetchSql-Methode bedeutet, dass sie nicht abfragt, sondern nur die erstellte SQL-Anweisung zurückgibt, und sie unterstützt nicht nur Select, sondern alle CURD Abfragen. Das von

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

generierte Unterabfrageergebnis lautet:

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

Verwenden Sie buildSql, um eine Unterabfrage zu erstellen

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

Das generierte Unterabfrageergebnis lautet:

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

Nach dem Aufruf der buildSql-Methode wird der eigentliche Abfragevorgang nicht ausgeführt, sondern nur die SQL-Anweisung der Abfrage generiert (um Verwirrung zu vermeiden, werden auf beiden Seiten des SQL Klammern hinzugefügt). und dann werden wir es in nachfolgenden Abfragen direkt aufrufen.

Dann verwenden Sie die Unterabfrage, um eine neue Abfrage zu erstellen:

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

Die generierte SQL-Anweisung lautet:

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

Verwenden Sie den Abschluss, um die Unterabfrage zu erstellen

IN/NOT IN und EXISTS/NOT Abfragen wie EXISTS können Abschlüsse direkt als Unterabfragen verwenden, zum Beispiel:

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

Die generierte SQL-Anweisung lautet

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

Die generierte SQL-Anweisung lautet

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

Zusätzlich zu den oben genannten Abfrage Zusätzlich zu Bedingungen unterstützen Vergleichsoperationen auch die Verwendung von Abschlussunterabfragen