sql >> Base de Datos >  >> Database Tools >> SQLyog

LÍMITE SQL por columna de identificación

En lugar de leer la tabla de servicios directamente, use una subconsulta y únase a ella.

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`

Dependiendo de su versión de mysql, no puede tener una subconsulta IN usando límite y desplazamiento (esta versión de MySQL aún no es compatible con 'LIMIT &IN/ALL/ANY/SOME subconsulta'), pero esto seguirá funcionando.

EDITAR:

Si establece la consulta interna a esto:

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

Entonces solo devolverá servicios con aeropuertos_en_vuelo y usuarios (posiblemente agregue una cláusula distinta).

EDITAR para aclarar:

En este momento tienes esto como tu selección:

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`

Desea limitar a 2 servicios (no sé si desea todos los servicios, supongo que solo aquellos con usuarios y aeropuertos coincidentes en vuelo), por lo que debe poner el límite en la tabla correcta.

En este caso, la tabla de la derecha es la tabla de servicios. Para simplificar las cosas, comencemos con una versión simplificada de lo que tienes:

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

Voy a suponer que hay un aeropuerto en la fila de vuelo para cada servicio (podemos agregar esa complejidad más adelante).

Para enumerar los 2 primeros servicios, queremos el límite de los servicios, no toda la consulta, por lo que sería:

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 reemplacé los servicios de mesa con una consulta, que ahora puedo limitar, esta es la subconsulta. Si ahora solo queremos ver los servicios que tienen un aeropuerto en vuelo, debemos cambiar esa subconsulta de:

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

Cambié el nombre de las tablas services y airports_in_flight ss y aifs para que no colisionen con los nombres en la consulta principal, puse una combinación interna para limitar mis filas solo a la tabla de servicio, y limitada por 2, por lo que coloqué la subconsulta en la consulta que obtenemos ahora:

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`

Debería poder expandir la subconsulta para agregar la unión interna para los usuarios (limitando así los servicios solo a aquellos que tienen filas de aeropuertos_en_vuelo y filas de usuarios) y agregar la tabla de usuarios a la consulta principal.