【问题标题】:SQL use of conditional AND on a join table to ensure at least two or multiple values are matchedSQL 在连接表上使用条件 AND 以确保至少匹配两个或多个值
【发布时间】:2012-04-02 01:38:01
【问题描述】:

我有一个名为languages_services 的连接表,它基本上连接了表serviceslanguages

我需要找到一个能够同时提供 ENGLISH (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 的那个,因为它不为 Espanol 提供服务。

非常感谢任何关于此的提示!

【问题讨论】:

    标签: mysql sql join inner-join relational-division


    【解决方案1】:
    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_id。 (添加 OR,或向 IN 列表添加项目,并将 COUNT(*) = 2 更改为 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
    

    【讨论】:

    • 太棒了,成功了!谢谢。如果可能的话,你能否展示一下它在两种语言的连接表中是如何工作的,只是为了得到一个想法?将不胜感激,谢谢。
    • @chadwtaylor - JOIN 为 2 种语言添加了版本
    • 你太棒了@Dems 的快速响应!我现在明白为什么您说前两个示例在聚合多种语言方面比连接更好。
    • @Dems 应该不是 COUNT(DISTINCT lanaguage_id) 而不是 COUNT(*),以防表允许 service_id 和 lanaguage_id 的相同组合的多个条目?
    • @MyOtherMe - 如果允许重复,可以。但我希望像这样的映射表有两个字段作为主键(并且是唯一的)。如果我在这个假设上错了,那么你的修复是绝对正确的:)
    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多