mysql中intersect关键字的解决方法
我需要在mysql数据库中获得一些结果的交集。但在谷歌搜索之后,人们才知道没有关键词可用。下面是我的示例表mysql中intersect关键字的解决方法,mysql,sql,Mysql,Sql,我需要在mysql数据库中获得一些结果的交集。但在谷歌搜索之后,人们才知道没有关键词可用。下面是我的示例表 gene table +------+--------+---------+ | id | symbol | test_id | +------+--------+---------+ | -1 | A | -1 | | 8 | A | 3 | | 9 | G | 3 | | -1 | A |
gene table
+------+--------+---------+
| id | symbol | test_id |
+------+--------+---------+
| -1 | A | -1 |
| 8 | A | 3 |
| 9 | G | 3 |
| -1 | A | -1 |
| -2 | B | -1 |
| -3 | C | -1 |
| 1 | A | 1 |
| 2 | B | 1 |
| 3 | C | 1 |
| 4 | B | 2 |
| 5 | C | 2 |
| 6 | D | 2 |
| 7 | E | 2 |
| 8 | A | 3 |
| 9 | G | 3 |
| 10 | F | 3 |
| 11 | C | 3 |
| 12 | C | 4 |
| 13 | G | 4 |
| 14 | F | 4 |
| 15 | M | 4 |
| 16 | N | 4 |
+------+--------+---------+
test table
+------+-------+
| id | name |
+------+-------+
| -1 | test0 |
| 3 | test3 |
| -1 | test0 |
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 4 | test4 |
+------+-------+
现在我想提出一个查询,它将为我提供对所提供基因的常见测试。e、 g.我将提供基因A、B、C,我应得到以下结果:
id name id symbol
---------------------------
-1 | test0 | -1 | A
-1 | test0 | -2 | B
-1 | test0 | -3 | C
1 | test1 | 1 | A
1 | test1 | 2 | B
1 | test1 | 3 | C
我只是试着按照下面的方法形成一个查询,但没有成功,结果集是空的,如果我在where子句中使用'or',则会对where子句中的所有基因进行测试
select distinct t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where g.symbol = 'A' and g.symbol='B' and g.symbol='C';
请帮助我构造查询。将那些
和条件更改为或条件,如下所示,因为在任何时间点g.symbol
只能包含一个值,不能包含多个值。这就是为什么您得到的结果集是空的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where (g.symbol = 'A' or g.symbol='B' or g.symbol='C')
and g.test_id = 1;
(或)在
中使用类似于操作员的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where g.symbol in ('A','B','C')
and g.test_id = 1;
将这些和
条件更改为或
条件,如下所示,因为在任何时间点g。符号
只能保存一个值,不能保存多个值。这就是为什么您得到的结果集是空的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where (g.symbol = 'A' or g.symbol='B' or g.symbol='C')
and g.test_id = 1;
(或)在
中使用类似于操作员的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where g.symbol in ('A','B','C')
and g.test_id = 1;
将这些和
条件更改为或
条件,如下所示,因为在任何时间点g。符号
只能保存一个值,不能保存多个值。这就是为什么您得到的结果集是空的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where (g.symbol = 'A' or g.symbol='B' or g.symbol='C')
and g.test_id = 1;
(或)在
中使用类似于操作员的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where g.symbol in ('A','B','C')
and g.test_id = 1;
将这些和
条件更改为或
条件,如下所示,因为在任何时间点g。符号
只能保存一个值,不能保存多个值。这就是为什么您得到的结果集是空的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where (g.symbol = 'A' or g.symbol='B' or g.symbol='C')
and g.test_id = 1;
(或)在
中使用类似于操作员的
select t.id, t.name, g.id, g.symbol from tests t
join genes g on t.id = g.test_id
where g.symbol in ('A','B','C')
and g.test_id = 1;
诀窍是使用您的标准筛选记录,然后按test.id
分组,以检查它是否符合all标准:
SELECT t.id
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id
HAVING COUNT(DISTINCT g.symbol) = 3;
因此,关键在于:
HAVING COUNT(DISTINCT g.symbol) = 3;
如果像测试2一样,在“B”上只有一个匹配项,那么计数将返回1,测试将被排除。要检查的项目数必须与HAVING子句中的数字匹配
如果随后需要获取完整数据,只需重新连接到表:
SELECT t.id, t.name, g.id, g.symbol
FROM genes AS g
INNER JOIN
( SELECT t.id, t.name
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id, t.name
HAVING COUNT(DISTINCT g.symbol) = 3
) t
ON t.id = g.test_id;
诀窍是使用您的标准筛选记录,然后按test.id
分组,以检查它是否符合所有标准:
SELECT t.id
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id
HAVING COUNT(DISTINCT g.symbol) = 3;
因此,关键在于:
HAVING COUNT(DISTINCT g.symbol) = 3;
如果像测试2一样,在“B”上只有一个匹配项,那么计数将返回1,测试将被排除。要检查的项目数必须与HAVING子句中的数字匹配
如果随后需要获取完整数据,只需重新连接到表:
SELECT t.id, t.name, g.id, g.symbol
FROM genes AS g
INNER JOIN
( SELECT t.id, t.name
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id, t.name
HAVING COUNT(DISTINCT g.symbol) = 3
) t
ON t.id = g.test_id;
诀窍是使用您的标准筛选记录,然后按test.id
分组,以检查它是否符合所有标准:
SELECT t.id
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id
HAVING COUNT(DISTINCT g.symbol) = 3;
因此,关键在于:
HAVING COUNT(DISTINCT g.symbol) = 3;
如果像测试2一样,在“B”上只有一个匹配项,那么计数将返回1,测试将被排除。要检查的项目数必须与HAVING子句中的数字匹配
如果随后需要获取完整数据,只需重新连接到表:
SELECT t.id, t.name, g.id, g.symbol
FROM genes AS g
INNER JOIN
( SELECT t.id, t.name
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id, t.name
HAVING COUNT(DISTINCT g.symbol) = 3
) t
ON t.id = g.test_id;
诀窍是使用您的标准筛选记录,然后按test.id
分组,以检查它是否符合所有标准:
SELECT t.id
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id
HAVING COUNT(DISTINCT g.symbol) = 3;
因此,关键在于:
HAVING COUNT(DISTINCT g.symbol) = 3;
如果像测试2一样,在“B”上只有一个匹配项,那么计数将返回1,测试将被排除。要检查的项目数必须与HAVING子句中的数字匹配
如果随后需要获取完整数据,只需重新连接到表:
SELECT t.id, t.name, g.id, g.symbol
FROM genes AS g
INNER JOIN
( SELECT t.id, t.name
FROM tests AS t
INNER JOIN genes AS g
ON t.id = g.test_id
WHERE g.symbol in ('A','B','C')
GROUP BY t.id, t.name
HAVING COUNT(DISTINCT g.symbol) = 3
) t
ON t.id = g.test_id;
其中g.symbol in('A','B','C')
@splash58我尝试过'或'代替'和'我得到了所有三个基因的测试,但我只需要交叉点(这三个基因共有的),为什么不希望id为-1的测试返回?这也有基因A、B和C?编辑结果表以反映您建议的更改。其中g.symbol in('A'、'B'、'C')
@splash58我尝试过”或“代替”和“我得到了所有三个基因的测试,但我只需要交集(这三个基因共有的)为什么不希望返回id-1的测试?这也有基因A、B和C?编辑结果表以反映您建议的更改。其中g.symbol in('A'、'B'、'C')
@splash58我尝试过”或“代替”和“我得到了所有三个基因的测试,但我只需要交集(这三个基因共有的)为什么不希望返回id-1的测试?这也有基因A、B和C?编辑结果表以反映您建议的更改。其中g.symbol in('A'、'B'、'C')
@splash58我尝试过”或“代替”和“我得到了所有三个基因的测试,但我只需要交集(这三个基因共有的)为什么不希望返回id-1的测试?这也有基因A,B和C?编辑了结果表以反映你所建议的变化。我也尝试了这个。我在我的问题中也提到了这一点。这不管用。谢谢你的回复。是的,你得到了绝对正确的结果。试着自己分析一下,你会发现的。我会在1分钟内给你提供查询结果。@AshokDongare,如果有帮助,请参阅答案中的编辑。如果只想得到test_id=1,那么将该条件添加到where
子句中。。。不只是测试id=1的测试。这可能是任何测试。我只是提供了一个样本,我也试过这个。我在我的问题中也提到了这一点。这不管用。谢谢你的回复。是的,你得到了绝对正确的结果。试着自己分析一下,你会发现的。我会在1分钟内给你提供查询结果。@AshokDongare,如果有帮助,请参阅答案中的编辑。如果只想得到test_id=1,那么将该条件添加到where
子句中。。。不只是测试id=1的测试。这可能是任何测试。我只是提供了一个样本我试过了