【问题标题】:SQL to select half of a two-part composite key based on multiple rows of keys?SQL根据多行键选择两部分复合键的一半?
【发布时间】:2012-05-01 14:18:05
【问题描述】:

我有一个这样的复合键表:

========TABLE========
key_a_col | key_b_col

场景:

key_b 是 'foo',在 key_a 下有一个 'bar' 和 'baz' 条目。另一个 key_b 'fiz' 有 'bar' 和 'raz'。

像这样:

========TABLE========
key_a_col | key_b_col
    'bar' | 'foo'
    'baz' | 'foo'
    'bar' | 'fiz'
    'raz' | 'fiz'

我想选择在 key_a_col 中同时存在“bar”和“baz”的所有 key_b 条目。所以 'foo' 会被返回(bar|foo 和 baz|foo 存在),而 'fiz' 不会(只有 fiz|bar 匹配)。

我怎样才能做到这一点?

【问题讨论】:

标签: mysql sql syntax sql-match-all


【解决方案1】:

ypercube 应该给你一个想法的链接,但如果你想进一步了解 N 个条件,你将不得不做 N 个连接。

这是另一种方法,您可以使用它来执行无连接的任意条件。使用您的 'biz' 和 'baz' 创建一个表条件

SELECT DISTINCT col_b FROM Table t1 
       WHERE ( SELECT COUNT(*) FROM Table t2 
                INNER JOIN Condition c on t2.key_b = c.condition
                WHERE t1.key_a = t2.key_a 
                GROUP BY t1.key_a) =  
              (SELECT COUNT(*) FROM CONDITION)

【讨论】:

    【解决方案2】:

    ypercube 的链接非常完美。我学到了一点点。以后读到这篇文章的人应该去:

    How to filter SQL results in a has-many-through relation

    我决定了:

    SELECT distinct(t.b_id)
    FROM   columns_table t
    WHERE  EXISTS (SELECT * FROM columns_table 
                   WHERE  columns_table.id = t.id AND columns_table.col_a = 'bar')
    AND 
    EXISTS (SELECT * FROM columns_table 
                   WHERE  columns_table.id = t.id AND columns_table.col_a = 'baz')
    

    看起来我可以将WHERE EXISTS 子句链接任意次数,并且仍然可以获得良好的性能。我还可以加入其他表,而不会使查询变得难以阅读。如果我可以投票赞成 ypercube 的评论,我会的。

    【讨论】:

    • 哎呀。完毕。再次感谢您的链接。
    猜你喜欢
    • 2023-01-06
    • 1970-01-01
    • 2012-09-22
    • 2020-09-25
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2015-01-08
    • 2014-05-26
    相关资源
    最近更新 更多