2010-02-11 5 views
0

J'ai une requête qui ressemble à ceci:filtre conditionnel pour MySQL requête

select a.title, is.filename 
    from articles a 
    join article_images ai on ai.article_id = a.article_id 
    join images i on i.image_id = ai.image_id 
    join image_sizes is on is.image_id = i.image_id 
where is.size_name = '96x96'; 

Donc il y a une N: N relation entre les articles et les images, et une N: 1 relation entre les images et les tailles d'image . Ceci sélectionne l'image 96x96 pour chaque article.

Maintenant, je veux changer cela afin qu'il sélectionne l'image 96x96, sauf le article_id est 42, auquel cas il sélectionne une taille différente. Existe-t-il un moyen de le faire dans une requête?

Répondre

4

Changement à ceci:

where (a.article_id <> 42 AND is.size_name = '96x96') 
    OR (a.article_id = 42 AND is.size_name = 'something different') 
+0

Cela fonctionnera certainement, mais il vaut la peine de noter que l'utilisation de UNION comme suggéré dans d'autres réponses devrait être légèrement plus rapide dans MySQL. OU peut empêcher les index utilisés. – Simon

+0

Merci, cela fonctionne très bien. La réponse 'UNION' est également bonne, mais je suis plus intéressé par la lisibilité que par l'efficacité dans ce cas, et cela me semble plus logique. – friedo

1

Je pense que vous devez séparer votre requête en deux requêtes: requête pour 96x96 et requête pour article_id = 42. Ensuite, vous devriez UNION ces deux résultats. Cela vous aidera également à garder vos requêtes propres et lisibles.

+0

bien qu'il pourrait avoir de meilleures performances, je ne dirais pas que la requête serait plus propre, plus lisible ou plus facile à maintenir ... – nickf

1
(select a.title, is.filename 
    from articles a 
    join article_images ai on ai.article_id = a.article_id 
    join images i on i.image_id = ai.image_id 
    join image_sizes is on is.image_id = i.image_id 
where is.size_name = '96x96' and a.article_id <> 42) 
union all 
(select a.title, is.filename 
    from articles a 
    join article_images ai on ai.article_id = a.article_id 
    join images i on i.image_id = ai.image_id 
    join image_sizes is on is.image_id = i.image_id 
where is.size_name = 'Some other size' and a.article_id = 42) 

Vous devrez remplacer « une autre taille » avec tout ce que l'autre est la taille, ou utilisez un SELECT TOP 1 et GROUP BY dans la deuxième requête si vous ne connaissez pas la taille.