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

SQL LIMIT op id-kolom

In plaats van de servicestabel rechtstreeks te lezen, gebruik je een subquery en sluit je je daarbij aan.

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`

Afhankelijk van uw versie van mysql, kunt u geen subquery IN hebben met limiet en offset (deze versie van MySQL ondersteunt nog geen 'LIMIT &IN/ALL/ANY/SOME subquery'), maar dit zal nog steeds werken.

BEWERKEN:

Als je de innerlijke vraag hierop instelt:

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

Dan retourneert het alleen services met airports_in_flight en gebruikers (mogelijk een aparte clausule toevoegen).

BEWERKEN om te verduidelijken:

Op dit moment heb je dit als je keuze:

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`

Je wilt je beperken tot 2 services (ik weet niet of je alle services wilt, ik vermoed alleen die met overeenkomende gebruikers en luchthavens tijdens de vlucht), dus je moet de limiet op de juiste tafel leggen.

In dit geval is de rechtertabel de servicestabel. Laten we, om het eenvoudig te maken, beginnen met een vereenvoudigde versie van wat je hebt:

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

Ik ga ervan uit dat er voor elke service een luchthaven in vlucht is (we kunnen die complexiteit later toevoegen).

Om de eerste 2 services op te sommen, willen we de limiet voor de services, niet de hele zoekopdracht, dus het zou zijn:

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`

Merk op dat ik de tabelservices heb vervangen door een query, die ik nu kan beperken, dit is de subquery. Als we nu alleen willen kijken naar diensten die een luchthaven in vlucht hebben, moeten we die subquery wijzigen van:

select * from services limit 2

naar

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

Ik heb de services en airports_in_flight-tabellen hernoemd ss en aifs zodat ze niet botsen met de namen in de hoofdquery, heb een inner join toegevoegd om mijn rijen te beperken tot alleen de servicetabel, en beperkt tot 2, dus zet de subquery in de vraag die we nu krijgen:

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`

U zou dan de subquery moeten kunnen uitbreiden om de inner join voor gebruikers toe te voegen (waardoor services worden beperkt tot alleen die met airports_in_flight-rijen en gebruikersrijen), en de gebruikerstabel aan de hoofdquery kunnen toevoegen.




  1. DBeaver voor de financiële sector:TOP-5 vragen

  2. SQL-QUERY OP MEERDERE TABELLEN

  3. PHPMyAdmin-paginafout na wijziging van het MySQL-poortnummer in WAMP

  4. Databaseback-up automatiseren met phpmyadmin