Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL在联接表上使用条件AND以确保至少两个或多个值匹配_Mysql_Sql_Join_Inner Join_Relational Division - Fatal编程技术网

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