SQLyog
 sql >> Base de données >  >> Database Tools >> SQLyog

LIMITE SQL par colonne id

Au lieu de lire directement la table des services, utilisez une sous-requête et joignez-vous à celle-ci.

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`

Selon votre version de mysql, vous ne pouvez pas avoir de sous-requête IN utilisant limit et offset (cette version de MySQL ne prend pas encore en charge la sous-requête 'LIMIT &IN/ALL/ANY/SOME') mais cela fonctionnera toujours.

MODIFIER :

Si vous définissez la requête interne sur ceci :

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

Ensuite, il ne renverra que les services avec airports_in_flight et les utilisateurs (ajoutez éventuellement une clause distincte).

MODIFIER pour clarifier :

En ce moment, vous avez ceci comme sélection :

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`

Vous souhaitez limiter à 2 services (je ne sais pas si vous voulez tous les services, je suppose uniquement ceux avec des utilisateurs et des aéroports en vol correspondants), vous devez donc mettre la limite dans le bon tableau.

Dans ce cas, la table de droite est la table des services. Pour simplifier les choses, commençons par une version simplifiée de ce que vous avez :

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

Je vais faire l'hypothèse qu'il y a un aéroport dans la ligne de vol pour chaque service (nous pouvons ajouter cette complexité plus tard).

Pour lister les 2 premiers services, nous voulons la limite des services, pas la requête entière, donc ce serait :

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`

Remarquez que j'ai remplacé les services de table par une requête, que je peux maintenant limiter, c'est la sous-requête. Si nous voulons maintenant ne regarder que les services qui ont un aéroport en vol, nous devons changer cette sous-requête de :

select * from services limit 2

à

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

J'ai renommé les tables services et airports_in_flight ss et aifs afin qu'elles n'entrent pas en collision avec les noms de la requête principale, j'ai mis une jointure interne pour limiter mes lignes à la seule table de service, et limitée par 2, donc mettre la sous-requête dans la requête que nous obtenons :

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`

Vous devriez ensuite pouvoir développer la sous-requête pour ajouter la jointure interne pour les utilisateurs (limitant ainsi les services à ceux qui ont des lignes airports_in_flight et des lignes utilisateurs), et ajouter la table des utilisateurs à la requête principale.