sql >> Databasteknik >  >> Database Tools >> SQLyog

SQL LIMIT efter id-kolumn

Istället för att läsa tjänstetabellen direkt, använd en underfråga och gå med i den.

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`

Beroende på din version av mysql, kan du inte ha en underfråga IN med limit och offset (denna version av MySQL stöder ännu inte 'LIMIT &IN/ALL/ALL/NOY/SOME subquery') men detta kommer fortfarande att fungera.

EDIT:

Om du ställer in den inre frågan till detta:

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

Då kommer det bara att returnera tjänster med airports_in_flight och användare (eventuellt lägg till en distinkt klausul).

EDIT för att förtydliga:

Just nu har du detta som ditt val:

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`

Du vill begränsa till 2 tjänster (jag vet inte om du vill ha alla tjänster, jag gissar bara de med matchande användare och flygplatser under flygning), så du måste sätta gränsen på rätt tabell.

I det här fallet är den högra tabellen tjänstetabellen. För att göra saker enkelt kan vi börja med en förenklad version av vad du har:

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

Jag kommer att anta att det finns en flygplats i flygraden för varje tjänst (vi kan lägga till den komplexiteten senare).

För att lista de två första tjänsterna vill vi ha gränsen för tjänsterna, inte hela frågan, så det skulle vara:

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`

Observera att jag ersatte tabelltjänsterna med en fråga som jag nu kan begränsa, det här är underfrågan. Om vi ​​nu bara vill titta på tjänster som har en flygplats på väg måste vi ändra den underfrågan från:

select * from services limit 2

till

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

Jag har bytt namn på tjänsterna och airports_in_flight-tabellerna ss och aifs så att de inte kolliderar med namnen i huvudfrågan, lagt en inre koppling för att begränsa mina rader till endast servicetabeller och begränsat med 2, så att lägga in underfrågan i frågan vi nu får:

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`

Du bör sedan kunna expandera underfrågan för att lägga till den inre kopplingen för användare (och därmed begränsa tjänsterna till endast de som har airports_in_flight-rader och användarrader), och lägga till användartabellen i huvudfrågan.




  1. Fel:1449, användaren som angetts som definierare ('root'@'localhost') existerar inte

  2. PHP Infoga i MySQL-syntaxfel

  3. phpmyadmin loggar ut efter 1440 sekunder

  4. SQL Server Management Studio kopplades bort efter en period av inaktivitet