2009-06-19 10 views
0

utilisateur a animaux, animaux peuvent avoir images Une image peut être définie comme image principale (mainpic = 0 ou mainpic = 1)Optimize 2 requêtes MySQL à un

Je dois obtenir toutes les données d'animaux de la table des animaux de compagnie et j'ai aussi besoin de l'id de l'image où mainpic = 1 ou première image ou null s'il n'a pas d'image dans la table de l'image. Je dois obtenir les données de l'animal de compagnie même s'il n'a pas d'image du tout.

Actuellement j'utilise 2 requêtes pour obtenir ce fait: SELECT * FROM animaux OÙ pets.userId = ORDER '$ userId' PAR pets.created ASC LIMITE 5 ... pour chaque résultat: SELECT id des images WHERE petId = '$ petId' ORDER BY mainpic DESC LIMIT 1

J'ai besoin de ce optimisé et dans une requête.

Merci, Hamlet

+0

en dehors de ma réponse ci-dessous, il semble que vous ne l'utilisez les instructions préparées pour vos requêtes (que vous devriez probablement). –

Répondre

1

utiliser une jointure interne pour omettre les enregistrements sans correspondance

select * 
from pets inner join pictures 
on pets.id = petId and mainpic=1 
where userId=? 
order by pets.created ASC limit 5 

si vous ne souhaitez que nulle dans les domaines liés à l'image, mais veulent la info animal (votre Q était un peu flou) puis utilisez une jointure gauche

select * 
from pets left join pictures 
on pets.id = petId and mainpic=1 
where userId=? 
order by pets.created ASC limit 5 
+0

merci beaucoup ça fonctionne très bien (j'avais besoin de la 2ème version) –

0

Essayez ceci:

SELECT * FROM pets 
INNER JOIN pictures ON pictures.petid = pets.id AND pictures.mainpic = 1 
WHERE pets.userid='$userid' 
0
SELECT * 
FROM pets p 
    LEFT OUTER JOIN (
     SELECT * 
     FROM pictures pict 
     WHERE pict.mainpic = 1 
    ) pict ON pict.petid = p.petid 
WHERE p.userid = '$userid' 
0
SELECT (
     SELECT id 
     FROM pictures pi 
     WHERE pi.petid = pe.petid 
     ORDER BY 
       mainpic DESC 
     LIMIT 1 
     ) 
FROM pets pe