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

LIMITE SQL per colonna ID

Invece di leggere direttamente la tabella dei servizi, usa una sottoquery e unisciti a quella.

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`

A seconda della tua versione di mysql, non puoi avere una sottoquery IN usando limit e offset (questa versione di MySQL non supporta ancora "LIMIT &IN/ALL/ANY/SOME subquery") ma funzionerà comunque.

MODIFICA:

Se imposti la query interna su questo:

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

Quindi restituirà solo servizi con aeroporti_in_volo e utenti (possibilmente aggiungendo una clausola distinta).

EDIT per chiarire:

In questo momento hai questo come tuo selezionato:

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`

Vuoi limitare a 2 servizi (non so se vuoi tutti i servizi, immagino solo quelli con utenti corrispondenti e aeroporti in volo), quindi devi mettere il limite sulla tabella giusta.

In questo caso, la tabella giusta è la tabella dei servizi. Per semplificare le cose, iniziamo con una versione semplificata di ciò che hai:

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

Darò per scontato che ci sia un aeroporto in fila per ogni servizio (possiamo aggiungere quella complessità in seguito).

Per elencare i primi 2 servizi, vogliamo il limite sui servizi, non l'intera query, quindi sarebbe:

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`

Si noti che ho sostituito i servizi tabella con una query, che ora posso limitare, questa è la sottoquery. Se ora vogliamo guardare solo i servizi che hanno un aeroporto in volo, dobbiamo cambiare quella sottoquery da:

select * from services limit 2

a

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

Ho rinominato i servizi e le tabelle airports_in_flight ss e aifs in modo che non entrino in collisione con i nomi nella query principale, ho inserito un inner join per limitare le mie righe alla sola tabella di servizio e limitato da 2, quindi inserendo la sottoquery in la query che ora otteniamo:

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`

Dovresti quindi essere in grado di espandere la sottoquery per aggiungere l'inner join per gli utenti (limitando così i servizi solo a quelli che hanno le righe airports_in_flight e users) e aggiungere la tabella users alla query principale.