Mysql SQL在联接表上使用条件AND以确保至少两个或多个值匹配
我有一个名为Mysql SQL在联接表上使用条件AND以确保至少两个或多个值匹配,mysql,sql,join,inner-join,relational-division,Mysql,Sql,Join,Inner Join,Relational Division,我有一个名为languages\u services的联接表,它基本上联接了表services和languages 我需要找到一个既能提供英语(language\u id=1)又能提供西班牙语(language\u id=2)的服务 有了上面提供的数据,我想测试language_id=1和language_id=2,结果如下 QUERY RESULT ------------ service_id ------------ 1 显然,它不会返回service_id=2的,因为它不为Espan
languages\u services
的联接表,它基本上联接了表services
和languages
我需要找到一个既能提供英语(language\u id=1)
又能提供西班牙语(language\u id=2)
的服务
有了上面提供的数据,我想测试language_id=1和language_id=2
,结果如下
QUERY RESULT
------------
service_id
------------
1
显然,它不会返回service_id=2的,因为它不为Espanol服务
非常感谢您的任何建议
SELECT
service_id
FROM
language_services
WHERE
language_id = 1
OR language_id = 2
GROUP BY
service_id
HAVING
COUNT(*) = 2
或者
如果您一直在研究两种语言,那么可以使用联接来实现,但是聚合版本更容易适应不同数量的语言ID。(添加一个OR,或将一个项目添加到IN列表中,并将计数(*)=2更改为计数(*)=3
,等等)
但是,请注意,这种方法的伸缩性非常差。使用这种表结构,您对此无能为力
编辑使用两种语言的联接的示例
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
太棒了,成功了!谢谢如果可能的话,您是否也可以展示一下在两种语言的联接表中是如何工作的,只是想了解一下?非常感谢。@chadwtaylor-JOIN
version为两种语言添加了一个新版本您真是太棒了@Dems的快速响应!我现在明白了为什么你说前两个例子在聚合多种语言方面比连接更好。@DEM不应该是COUNT(不同的Language_id)而不是COUNT(*),如果表允许服务id和Language_id的相同组合的多个条目?@MyOtherMe-如果允许重复,是的。但我希望像这样的映射表将这两个字段作为主键(并且是唯一的)。如果我在这个假设上错了,那么你的修正是绝对正确的:)
WHERE
lanaguage_id IN (1,2)
GROUP BY
service_id
HAVING
COUNT(*) = 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