SQLyog
 sql >> Datenbank >  >> Database Tools >> SQLyog

SQL LIMIT nach ID-Spalte

Anstatt die Dienstetabelle direkt zu lesen, verwenden Sie eine Unterabfrage und verknüpfen Sie diese.

select s.*, u.`fname`, u.`lname`, aif.`airport` FROM 
    ( select * from services order by id limit 2) as s INNER JOIN airports_in_flight aif
    ON s.`id` = aif.`service_id` INNER JOIN users u
    ON s.`service_provider_id` = u.`id`

Abhängig von Ihrer mysql-Version können Sie keine Unterabfrage IN mit Limit und Offset haben (diese Version von MySQL unterstützt 'LIMIT &IN/ALL/ANY/SOME subquery' noch nicht), aber das wird trotzdem funktionieren.

BEARBEITEN:

Wenn Sie die innere Abfrage auf Folgendes setzen:

(SELECT s.id
FROM services s
INNER JOIN airports_in_flight aif
    ON s.`id` = aif.`service_id`
INNER JOIN users u
    ON s.`service_provider_id` = u.`id`
LIMIT 2)

Dann werden nur Dienste mit airports_in_flight und Benutzern zurückgegeben (möglicherweise eine eigene Klausel hinzufügen).

EDIT zur Verdeutlichung:

Im Moment haben Sie dies als Ihre Auswahl:

select s.*, u.`fname`, u.`lname`, aif.`airport` FROM 
        services as s INNER JOIN airports_in_flight aif
        ON s.`id` = aif.`service_id` INNER JOIN users u
        ON s.`service_provider_id` = u.`id`

Sie möchten auf 2 Dienste beschränken (ich weiß nicht, ob Sie alle Dienste möchten, ich vermute nur die mit übereinstimmenden Benutzern und Flughäfen im Flug), also müssen Sie das Limit auf die rechte Tabelle setzen.

In diesem Fall ist die rechte Tabelle die Servicetabelle. Beginnen wir der Einfachheit halber mit einer vereinfachten Version dessen, was Sie haben:

SELECT s.*, aif.`airport` FROM 
        services as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Ich gehe davon aus, dass es für jeden Dienst einen Flughafen in der Flugreihe gibt (wir können diese Komplexität später hinzufügen).

Um die ersten 2 Dienste aufzulisten, möchten wir das Limit für die Dienste, nicht die gesamte Abfrage, also wäre es:

SELECT s.*, u.`fname`, u.`lname`, aif.`airport` FROM 
        (select * from services limit 2) as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Beachten Sie, dass ich die Tabellendienste durch eine Abfrage ersetzt habe, die ich jetzt einschränken kann, dies ist die Unterabfrage. Wenn wir jetzt nur Dienste betrachten wollen, die einen Flughafen im Flug haben, müssen wir diese Unterabfrage ändern von:

select * from services limit 2

zu

select ss.* from services ss 
inner join airports_in_flight aifs on ss.`in` = aifs.`service_id` limit 2

Ich habe die Tabellen services und airports_in_flight in ss und aifs umbenannt, damit sie nicht mit den Namen in der Hauptabfrage kollidieren, einen inneren Join eingefügt, um meine Zeilen nur auf die Servicetabelle zu beschränken, und durch 2 begrenzt, also die Unterabfrage eingefügt die Abfrage erhalten wir nun:

select s.*, u.`fname`, u.`lname`, aif.`airport` 
FROM 
  (select ss.* from services ss 
   inner join airports_in_flight aifs on ss.`in` = aifs.`service_id`
   limit 2) as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Sie sollten dann in der Lage sein, die Unterabfrage zu erweitern, um den inneren Join für Benutzer hinzuzufügen (wodurch die Dienste nur auf diejenigen beschränkt werden, die die Zeilen "airports_in_flight" und "users" haben) und die Tabelle "users" zur Hauptabfrage hinzuzufügen.