Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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中检查一次选择的结果是否包含另一次选择?_Mysql - Fatal编程技术网

如何在MySQL中检查一次选择的结果是否包含另一次选择?

如何在MySQL中检查一次选择的结果是否包含另一次选择?,mysql,Mysql,我有桌子 CREATE TABLE one ( op INT, value INT ); 及 现在我想得到所有op值,其中op的值集包含给定tp的所有值 我将这样写: SELECT op FROM one AS o1 WHERE ( (SELECT value FROM one AS o2 WHERE o1.op = o2.op) CONTAINS ALL (SELECT value FROM two WHERE tp=<specific-value>) )

我有桌子

CREATE TABLE one (
  op INT,
  value INT
);

现在我想得到所有op值,其中op的值集包含给定tp的所有值

我将这样写:

SELECT op FROM one AS o1 WHERE (
  (SELECT value FROM one AS o2 WHERE o1.op = o2.op)
  CONTAINS ALL
  (SELECT value FROM two WHERE tp=<specific-value>)
)
不幸的是,我找不到这样一个CONTAINS ALL和nothing操作符

表1包含50万条记录,表2包含100万条记录。平均而言,一个op和tp有20个不同的值。

考虑一下您的表名称ops和tps

考虑表名ops和tps


你能给出你想要的确切的SQL吗?你可以使用一个内部连接/在这里?还是我弄错了一些明显的东西?关于样本数据,请参见同意Raymond的意见@RaymondNijland,ALL SELECT用于将一个值与SELECT子句的所有可能值进行比较,它必须对ALL为真,但在这里并非如此。他并不是将一个值与tp表的所有值进行比较,而是如果给定tp有4个记录值,那么我们需要列出所有具有所有这4个或更多记录值的op。如果我误解了什么,请告诉我。@RaymondNijland,谢谢,我也尝试过你的方法,至少如果我理解正确的话,但不幸的是,查询没有在合理的时间内完成。公平地说,你没有说你希望得到性能最好的查询,也没有提供表中记录数量的任何信息,索引肯定会有帮助。你能给出你想要的确切的SQL吗?你可以使用一个内部连接/在这里?还是我弄错了一些明显的东西?关于样本数据,请参见同意Raymond的意见@RaymondNijland,ALL SELECT用于将一个值与SELECT子句的所有可能值进行比较,它必须对ALL为真,但在这里并非如此。他并不是将一个值与tp表的所有值进行比较,而是如果给定tp有4个记录值,那么我们需要列出所有具有所有这4个或更多记录值的op。如果我误解了什么,请告诉我。@RaymondNijland,谢谢,我也尝试过你的方法,至少如果我理解正确的话,但不幸的是,查询没有在合理的时间内完成。公平地说,你没有说你希望得到性能最好的查询,也没有提供表中记录数量的任何信息,索引肯定会有帮助的。谢谢。我认为这可能会起作用。很遗憾,我无法确认,因为查询仍在运行。所有字段都被编入索引,这就是解释显示给我的内容:。这会这么慢吗?@mstrap,在WHERE子句中也使用tps.tp=1,它将减少连接数并提高性能。查看更新的查询。谢谢!添加“WHERE”-子句肯定更好。不幸的是,它仍然太慢,快2分钟了。我在我的问题中增加了有关记录计数的信息。我的问题得到了回答。不过,如果您对加快此速度有任何想法,我将不胜感激。如果查询的某些部分最好在我们的代码中执行,而不是在MySQL中执行,那也没问题。@mstrap,请共享EXPLAIN语句的新输出,我们肯定可以根据此查询中使用的索引对其进行改进。我已将新的EXPLAIN计划粘贴在:。这一次,我使用了真名,以确保在翻译问题中的示例名时不会出错。如果您可能会感到困惑,我可以将其翻译回示例名称。另外,请注意,我已经从查询中跳过了“SELECT COUNTDISTINCT tps.value FROM tps WHERE tps.tp=1”,因为它是一个常量,可以在主查询之前轻松计算。谢谢。我认为这可能会起作用。很遗憾,我无法确认,因为查询仍在运行。所有字段都被编入索引,这就是解释显示给我的内容:。这会这么慢吗?@mstrap,在WHERE子句中也使用tps.tp=1,它将减少连接数并提高性能。查看更新的查询。谢谢!添加“WHERE”-子句肯定更好。不幸的是,它仍然太慢,快2分钟了。我在我的问题中增加了有关记录计数的信息。我的问题得到了回答。不过,如果您对加快此速度有任何想法,我将不胜感激。如果查询的某些部分最好在我们的代码中执行,而不是在MySQL中执行,那也没问题。@mstrap,请共享EXPLAIN语句的新输出,我们肯定可以根据此查询中使用的索引对其进行改进。我已将新的EXPLAIN计划粘贴在:。这一次,我使用了真名,以确保在翻译问题中的示例名时不会出错。如果您可能会感到困惑,我可以将其翻译回示例名称。另外,请注意,我已经从查询中跳过了“SELECT COUNTDISTINCT tps.value FROM tps WHERE tps.tp=1”,因为它是一个可以在主查询之前轻松计算的常量。
SELECT op FROM one AS o1 WHERE (
  (SELECT value FROM one AS o2 WHERE o1.op = o2.op)
  CONTAINS ALL
  (SELECT value FROM two WHERE tp=<specific-value>)
)
SELECT 
    ops.op
FROM ops
INNER JOIN tps ON tps.value = ops.value 
WHERE tps.tp = 1
GROUP BY ops.op
HAVING COUNT(DISTINCT ops.value) = (SELECT COUNT(DISTINCT tps.value) FROM tps WHERE tps.tp = 1);  --- You can replace 1 with any tp value.