sql >> Databáze >  >> Database Tools >> SQLyog

SQL LIMIT podle sloupce id

Místo přímého čtení tabulky služeb použijte dílčí dotaz a připojte se k němu.

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`

V závislosti na vaší verzi mysql nemůžete mít poddotaz IN pomocí limitu a offsetu (tato verze MySQL zatím nepodporuje 'LIMIT &IN/ALL/ANY/SOME subquery'), ale bude to stále fungovat.

EDIT:

Pokud nastavíte vnitřní dotaz na toto:

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

Pak vrátí pouze služby s letišti_v_letu a uživateli (případně přidat odlišnou klauzuli).

UPRAVIT pro upřesnění:

Právě teď máte jako svůj výběr toto:

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`

Chcete omezit na 2 služby (nevím, jestli chcete všechny služby, hádám, že jen ty s odpovídajícími uživateli a letišti za letu), takže musíte limit umístit na správnou tabulku.

V tomto případě je pravou tabulkou tabulka služeb. Abychom to zjednodušili, začněme zjednodušenou verzí toho, co máte:

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

Vycházím z předpokladu, že pro každou službu je v řadě letů letiště (tu složitost můžeme přidat později).

Chcete-li uvést první 2 služby, chceme limit na služby, ne celý dotaz, takže by to bylo:

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`

Všimněte si, že jsem nahradil tabulkové služby dotazem, který nyní mohu omezit, toto je poddotaz. Pokud se nyní chceme podívat pouze na služby, které mají za letu letiště, musíme tento dílčí dotaz změnit z:

select * from services limit 2

do

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

Přejmenoval jsem služby a tabulky airports_in_flight ss a aifs, aby nekolidovaly s názvy v hlavním dotazu, vložil jsem vnitřní spojení, abych omezil své řádky pouze na tabulku služeb, a omezil jsem je na 2, takže vložení poddotazu do dotaz, který nyní dostáváme:

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`

Poté byste měli být schopni rozšířit poddotaz a přidat vnitřní spojení pro uživatele (a tím omezit služby pouze na ty, kteří mají řádky airports_in_flight a řádky uživatelů), a přidat tabulku uživatelů do hlavního dotazu.




  1. SQL Opakující se řetězec znaků

  2. Jak používat Součet a Vnitřní spojení v příkazu delete a přidat do něj třetí tabulku

  3. Importujte velký soubor csv pomocí phpMyAdmin

  4. Odebrat datum/čas ve skriptu SQL generovaném pomocí SSMS?