web-dev-qa-db-fra.com

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

J'ai un Jobs et un Companies table, et je veux extraire 20 jobs qui répondent aux critères suivants:

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

J'ai essayé le SELECT suivant avec UNION DISTINCT, mais le problème est que le LIMIT 0,10 s'applique à l'ensemble des résultats. Je veux que cela 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 sur MySQL, alors réalisez qu'il peut y avoir un moyen plus intelligent de le faire au lieu d'utiliser UNION, donc toutes les suggestions d'amélioration sont certainement les bienvenues.

56
user172517

Citant les docs ,

Pour appliquer ORDER BY ou LIMIT à un 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);
145
Alex Martelli