2010-02-11 64 views
0

我有一个查询,看起来像这样:为MySQL查询条件过滤器

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'; 

所以有一个N:N文章和图片之间的关系,以及N:图像和图像尺寸之间的关系1 。这为每篇文章选择96x96图像。

现在我想改变它,所以它选择96x96图像,除非article_id是42,在这种情况下,它选择不同的大小。有没有办法在一个查询中做到这一点?

回答

4

改成这样:

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

这肯定会起作用,但值得注意的是,使用其他答案中建议的UNION应该在MySQL中稍微快一点。或者可以阻止正在使用的索引。 – Simon 2010-02-11 22:38:27

+0

谢谢,这个作品很棒。 'UNION'答案也很好,但在这种情况下,我对可读性比效率更感兴趣,这对我来说更有意义。 – friedo 2010-02-11 23:05:31

1

我想你应该查询分为两个查询:为96×96和查询的article_id = 42的查询。那么你应该联合这两个结果。它还将帮助您保持查询清晰可读。

+0

虽然它可能有更好的性能,但我不会说这个查询会更干净,更易读或更容易维护... – nickf 2010-02-11 22:42:37

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) 

您需要替换“其他一些大小”与任何其他尺寸,或在第二个查询使用SELECT TOP 1和GROUP BY,如果你不知道的大小。