2014-08-31 63 views
0

我需要帮助:SQL凡在同一列的2个值左连接

我有一个表称为录音制品phonogram_instruments过滤器

在录音制品表,我有很多数据可以在我的应用上获取。一个表音文字有许多表音文字表,每个表音表属于一个过滤器。

我需要获取已phonogram_instrument.filter_id所有录音制品= 25和phonogram_instrument.filter_id = 30

我有一个查询正常工作与一个值:

SELECT * FROM "phonograms" 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
    ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
    (phonogram_instruments_phonograms.filter_id = 29) 

,但如果我把另一价值,它不:

SELECT * FROM "phonograms" 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
    ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
    (phonogram_instruments_phonograms.filter_id = 29) 
    AND (phonogram_instruments_phonograms.filter_id = 25) 

你能帮我吗? :)

回答

1

没有办法,一个过滤器_id行可能在同一时间有29和25的值

所以,你应该用OR代替AND

SELECT * FROM "phonograms" 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
phonogram_instruments_phonograms.filter_id = 29 
OR phonogram_instruments_phonograms.filter_id = 25 

如果你在那里语句包含多个过滤器,把两个支架

SELECT * FROM "phonograms" 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
(
    phonogram_instruments_phonograms.filter_id = 29 
    OR phonogram_instruments_phonograms.filter_id = 25 
) 
AND ... other filters 
+0

每个录音带都有很多乐器,每个乐器都属于一个滤镜。在我的情况下,我有两个乐器的录音文件(第一个属于一个ID为29的过滤器,另一个属于ID为25的过滤器),我想取这个独特的录音文件。 – 2014-08-31 05:08:55

+0

@DiegoPolidoSantana,您是否可以在您的选择声明中添加示例数据和预期数据,以便我可以更好地了解您的案例? – simsim 2014-08-31 05:16:24

+0

http://pastebin.com/FMt60gUq – 2014-08-31 05:29:49

0

我首先想到的是使用相交复合运算这样你之间的过滤器过滤器_id声明:

SELECT * FROM "phonograms" 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
    ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
    phonogram_instruments_phonograms.filter_id = 29 
INTERSECT 
SELECT * FROM "phonograms" 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
    ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
    phonogram_instruments_phonograms.filter_id = 25 

它不是特别漂亮,如果需要与任意数量的filter_id相交(如:找到phonogram_instrument.filter_id为29,25和37的所有唱片。在这种情况下,我可能会建议一个有趣的选择(这亦同样适用于只有两个值以及):

SELECT * FROM "phonograms", count(phonograms.id) as 'num_ids' 
LEFT OUTER JOIN "phonogram_instruments" "phonogram_instruments_phonograms" 
    ON "phonogram_instruments_phonograms"."phonogram_id" = "phonograms"."id" 
WHERE 
    phonogram_instruments_phonograms.filter_id IN (29, 25) 
GROUP BY 
    phonograms.id 
HAVING 
    num_ids = 2 

如果你有超过2个filter_ids,扩大在括号列表WHERE子句和改变数值在相应的HAVING子句中。

+0

的项目我看,谢谢! – 2014-08-31 05:43:25