2010-02-11 117 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,如果你不知道的大小。