2012-03-16 108 views
4

我有一个名为languages_services的连接表,基本上连接表serviceslanguagesSQL使用条件AND在连接表上以确保至少有两个或多个值匹配

我需要找到能够同时服务英语(language_id=1)和ESPANOL (language_id=2)的服务。

table languages_services 
------------------------ 
service_id | language_id 
------------------------ 
1   | 1 
1   | 2 
1   | 3 
2   | 1 
2   | 3 

上面提供的数据,我想测试language_id=1 AND language_id=2它的结果是这样的

QUERY RESULT 
------------ 
service_id 
------------ 
1 

显然,它不会返回一个若service_id = 2,因为它不服务西班牙人。

对此的任何提示非常感谢!

回答

5
SELECT 
    service_id 
FROM 
    language_services 
WHERE 
    language_id = 1 
    OR language_id = 2 
GROUP BY 
    service_id 
HAVING 
    COUNT(*) = 2 

或者......

WHERE 
    lanaguage_id IN (1,2) 
GROUP BY 
    service_id 
HAVING 
    COUNT(*) = 2 

如果你一直在寻找2种语言,你可以用做它加入,但总的版本更容易适应不同language_ids的数字。 (添加一个OR,或将一个项目添加到IN列表中,并将更改为COUNT(*) = 3等等)。

但请注意,这个比例很差。对于这种表格结构,你可以做的事情不多。使用连接2种语言

SELECT 
    lang1.service_id 
FROM 
    language_services AS lang1 
INNER JOIN 
    language_services AS lang2 
    ON lang1.service_id = lang2.service_id 
WHERE 
     lang1.language_id = 1 
    AND lang2.language_id = 2 
+0

真棒


编辑例如,成功了!谢谢。如果可能,你是否也可以展示两种语言的连接表是如何工作的,只是为了得到一个想法?这将不胜感激,谢谢。 – chadwtaylor 2012-03-16 14:04:41

+0

@chadwtaylor - 为两种语言添加'JOIN'版本 – MatBailie 2012-03-16 14:10:50

+0

您真棒@Dems快速响应!现在我可以明白为什么你说前两个例子在聚合多种语言和连接方面更好。 – chadwtaylor 2012-03-16 14:14:42