假设我们有一个包含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
答案 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
值内重复。
这实际上是将您的描述逐字转换为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;
这种方法可以将名称放在一次。你必须要小心它们是按字母顺序排列的。