mysql—有没有一种方法可以根据另一列与返回多行的子查询的比较来从列中选择值?

vngu2lb8  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(243)

我试着用一个例子来澄清标题中的问题,
你有table吗 X ,此表包含列 foo VARCHAR 以及 bar INT 表中的值如下:

TABLE X
-------------
| foo | bar |
-------------
| 'a' |  1  |
| 'a' |  2  |
| 'a' |  3  |
| 'b' |  1  |
| 'b' |  2  |
| 'c' |  1  |
-------------

为了简化,我们将举一个子查询可以返回什么的例子 (1,2) 我想使用 (1,2) 这是:

----------
| result |
----------
|  'a'   |
|  'b'   |
----------

因为 a 以及 b 是唯一一个 1 以及 2bar 列。
所以基本上,我想做的是得到 foo 具有所有 bar 子查询返回的值。
但是,我不知道这是否可行,因为我需要将多个具有相同属性的列分组 foo 然后比较他们的 bar 子查询返回的值。
如果你想尝试一下你自己这里是一个最小的生殖例子,你可以继续https://sqliteonline.com/
确保使用mysql或mariadb

CREATE TABLE X (
    foo VARCHAR(16) NOT NULL,
    bar INT NOT NULL,
    PRIMARY KEY (foo,bar)
);

INSERT INTO X(foo,bar) VALUES ('a', 1);
INSERT INTO X(foo,bar) VALUES ('a', 2);
INSERT INTO X(foo,bar) VALUES ('a', 3);
INSERT INTO X(foo,bar) VALUES ('b', 1);
INSERT INTO X(foo,bar) VALUES ('b', 2);
INSERT INTO X(foo,bar) VALUES ('c', 1);

您不需要使用子查询,只需假设它也将返回 (1) , (1,2) , (2,3) , (1,2,3) 或者其他组合(顺序无关紧要)。

nszi6y05

nszi6y051#

您可以使用聚合和筛选:

select foo
from x
where bar in (1, 2)
group by foo
having count(*) = 2;  -- number of items in the list of bars

您的示例数据没有重复项。但如果有,就用 count(distinct bar) = 2 相反。
编辑:
如果有子查询,请使用:

with s as (
      <subquery here>
     )
select foo
from x join
     s
     on s.bar = x.bar
group by foo
having count(*) = (select count(*) from s);

相关问题