SQL - 选择参数A是多个值之一且参数B相等的位置

时间:2014-08-11 14:46:30

标签: mysql sql select

假设我们有一个包含A列和B列的表。

我需要选择行,其中参数A是设置的ARRAY值之一,这些行的参数B是相等的,而没有其他行带参数A,它不在ARRAY中,但是它的行相等参数B到ARRAY中的参数。

例如我们有表:

John    1
Andrew  1
John    2
Paul    2
John    3
Andrew  3
Paul    3

我需要根据ARRAY =(John,Andrew)选择行,所以结果应该只是前两行(参数A都在ARRAY中,参数B是相等的,没有其他行具有相等的参数B ):

John    1
Andrew  1

你能帮我解决那个(MySQL)的SQL SELECT语法吗?

PS:ARRAY中的参数数量可能会有所不同。

PS2:结果应该只是行,其中ARRAY中的每个项目都存在。因此,例如,如果ARRAY =(John,Andrew,Paul),结果应该只是:

John    3
Andrew  3
Paul    3

2 个答案:

答案 0 :(得分:2)

SELECT *
FROM YourTable
WHERE a IN ('John', 'Andrew', 'Paul')
AND b NOT IN (
    SELECT b
    FROM YourTable
    WHERE a NOT IN ('John', 'Andrew', 'Paul')
) AND b IN (
    SELECT b
    FROM YourTable
    WHERE a IN ('John', 'Andrew', 'Paul')
    GROUP BY b
    HAVING COUNT(*) = 3)

COUNT(*)限定符应与集合中的元素数相同。这假设名称不会在特定b值内重复。

DEMO

这实际上是将您的描述逐字转换为SQL。

答案 1 :(得分:1)

我使用带有group by子句的having来解决这些问题。以下内容获取符合条件的B

select b
from yourtable t
group by b
having count(distinct a) = 3 and
       count(distinct case when a in ('John', 'Andrew', 'Paul') then a end) = 3;

然后,您可以通过加入此列表来选择群组本身:

select t.*
from yourtable t join
     (select b
      from yourtable t
      group by b
      having count(distinct a) = 3 and
             count(distinct case when a in ('John', 'Andrew', 'Paul') then a end) = 3
     ) bt
     on t.b = bt.b;

编辑:

实际上,使用group_concat()有类似的方法:

select t.*
from yourtable t join
     (select b, group_concat(distinct a order by a) as acols
      from yourtable t
      group by b
      having acols = 'Andrew,John,Paul'
     ) bt
     on t.b = bt.b;

这种方法可以将名称放在一次。你必须要小心它们是按字母顺序排列的。