Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中intersect关键字的解决方法_Mysql_Sql - Fatal编程技术网

mysql中intersect关键字的解决方法

mysql中intersect关键字的解决方法,mysql,sql,Mysql,Sql,我需要在mysql数据库中获得一些结果的交集。但在谷歌搜索之后,人们才知道没有关键词可用。下面是我的示例表 gene table +------+--------+---------+ | id | symbol | test_id | +------+--------+---------+ | -1 | A | -1 | | 8 | A | 3 | | 9 | G | 3 | | -1 | A |

我需要在mysql数据库中获得一些结果的交集。但在谷歌搜索之后,人们才知道没有关键词可用。下面是我的示例表

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的测试。这可能是任何测试。我只是提供了一个样本我试过了