114 votes

Combinaison des opérations UNION et LIMIT dans une requête MySQL

J'ai un Emplois et un Entreprises et je veux extraire 20 emplois qui répondent aux critères suivants :

  1. Emplois uniquement de deux (2) entreprises nommées
  2. Il peut y avoir au maximum 10 emplois par entreprise

J'ai essayé ce qui suit SELECT con UNION DISTINCT mais le problème est que le LIMIT 0,10 s'applique à l'ensemble des résultats. Je veux qu'elle s'applique à chacune des entreprises.

S'il n'y a pas 10 emplois par entreprise, la requête doit renvoyer tous les emplois qu'elle trouve.

SELECT c.name, j.title, j.`desc`, j.link 
  FROM jobs_job j
INNER JOIN companies_company c ON j.company_id = c.id
WHERE c.name IN ('Company1')
UNION DISTINCT
SELECT c.name, j.title, j.`desc`, j.link 
  FROM jobs_job j
INNER JOIN companies_company c ON j.company_id = c.id
WHERE c.name IN ('Company2')
ORDER by name, title
LIMIT 0,10

Je suis nouveau dans le monde de MySQL, et je réalise qu'il y a peut-être une façon plus intelligente de faire cela plutôt que d'utiliser UNION, donc toute suggestion d'amélioration est la bienvenue.

276voto

Alex Martelli Points 330805

Citation : les docs ,

Pour appliquer ORDER BY ou LIMIT à un fichier SELECT individuel, placez la clause à l'intérieur des parenthèses qui entourent le SELECT :

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

6voto

bioye Points 21

En améliorant la réponse d'Alex et en se basant sur l'observation de Joe, ce qui suit devrait fonctionner dans SQLite :

SELECT * FROM 
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

0voto

Arpan Saini Points 383

Dans Teradata, nous ne pouvons pas utiliser union avec les requêtes supérieures, si vous le faites, vous obtenez une erreur, qui doit être modifiée comme indiqué ci-dessous. Ajout d'une solution pour les utilisateurs de Teradata.

Union and Top can written together as given below in Teradata

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X