SQLyog
 sql >> Base de Dados >  >> Database Tools >> SQLyog

SQL LIMIT por coluna de id


Em vez de ler a tabela de serviços diretamente, use uma subconsulta e junte-se a ela.
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`

Dependendo da sua versão do mysql, você não pode ter uma subconsulta IN usando limit e offset (Esta versão do MySQL ainda não suporta 'LIMIT &IN/ALL/ANY/SOME subconsulta'), mas isso ainda funcionará.

EDITAR:

Se você definir a consulta interna para isso:
(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)

Em seguida, ele retornará apenas serviços com aeroportos_in_flight e usuários (possivelmente adicionar uma cláusula distinta).

EDITAR para esclarecer:

Agora você tem isso como seu select:
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`

Você quer limitar a 2 serviços (não sei se você quer todos os serviços, estou supondo apenas aqueles com usuários e aeroportos correspondentes em voo), então você precisa colocar o limite na tabela certa.

Nesse caso, a tabela correta é a tabela de serviços. Para simplificar as coisas, vamos começar com uma versão simplificada do que você tem:
SELECT s.*, aif.`airport` FROM 
        services as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Vou supor que há um aeroporto na fila de voos para cada serviço (podemos adicionar essa complexidade mais tarde).

Para listar os 2 primeiros serviços, queremos o limite dos serviços, não a consulta inteira, então seria:
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`

Observe que substituí os serviços de tabela por uma consulta, que agora posso limitar, esta é a subconsulta. Se agora queremos ver apenas os serviços que têm um aeroporto em voo, precisamos alterar essa subconsulta de:
select * from services limit 2

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

Renomeei as tabelas services e airports_in_flight ss e aifs para que não colidam com os nomes na consulta principal, coloquei uma junção interna para limitar minhas linhas apenas à tabela de serviço e limitada por 2, colocando a subconsulta em a consulta que obtemos agora:
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`

Você deve poder expandir a subconsulta para adicionar a junção interna para usuários (limitando assim os serviços apenas para aqueles que têm linhas airports_in_flight e linhas users) e adicionar a tabela users à consulta principal.