Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/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_Sql_Count - Fatal编程技术网

Mysql 若干子查询之和

Mysql 若干子查询之和,mysql,sql,count,Mysql,Sql,Count,我试图根据一个表与两个表之间的关系数对一个表(我们称之为父表)进行排序(我们称之为Child1和Child2)。现在我是这样做的: SELECT Master.id (SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) + (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS score ORDER BY score DESC; WITH First AS (

我试图根据一个表与两个表之间的关系数对一个表(我们称之为父表)进行排序(我们称之为Child1和Child2)。现在我是这样做的:

SELECT Master.id
 (SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) 
 + (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS  score
 ORDER BY score DESC;
WITH First AS (
    SELECT id, COUNT(*) AS Cnt FROM Child1 GROUP BY id
),
Second AS (
    SELECT id, COUNT(*) AS Cnt FROM Child2 GROUP BY id
)
SELECT Master.id, First.Cnt, Second.Cnt, First.Cnt+Second.Cnt as score
    FROM Master
    INNER JOIN First ON Master.id=First.id
    INNER JOIN Second ON Master.id=Second.id
    ORDER BY score DESC;
它按预期工作,但很难维护,因为我无法知道子查询的中间值是什么。我想说的是:

 SELECT Master.id
 (SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) AS child1_score,
 (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS  child2_score,
 child1_score + child2_score AS score
 ORDER BY score DESC;
但是这给了我一个错误,说child1和child2没有定义。我能想到的唯一干净的方法是使用额外级别的嵌套子查询:

SELECT child1_score + child2_score AS score, id FROM
    (SELECT Master.id
     (SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) AS child1_score,
     (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS  child2_score)
    ORDER BY score DESC;
但这对记忆来说似乎要糟糕得多


有没有更好的方法来处理这个我还没看到的问题?我使用的是MySQL,但如果可能的话,我想坚持使用标准语法。

基于上一个查询:

SELECT child1_score + child2_score AS score, id FROM
    (SELECT Master.id
     (SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) AS child1_score,
     (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS  child2_score)
    ORDER BY score DESC;
让我觉得你只需要
Master.id
score
就可以
SELECT
ed了

我想这个查询应该可以:

SELECT Master.id
(SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) + (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS score
FROM Master
ORDER BY score DESC;

好吧,这对内存来说并不糟糕——记住DBMS(特别是MySQL)有一个规划器,可以动态优化查询。您应该避免在查询中使用笛卡尔积,但在上一次查询和@KaeL提出的查询之间实际上并没有显著差异。中间别名
child1\u score
child2\u score
在内部只是指针,所以请不要麻烦。
最后,如果我们不能依赖DBMS的可靠性和性能,为什么我们要使用DBMS

编辑:为了检查查询的执行情况,您需要
解释


如果不在顶级查询中显式选择子查询中的中间别名,似乎无法从子查询中保留它们。必须单独测试子查询是否按预期工作,然后通过构造嵌套查询和进一步使用
EXPLAIN
分析进行优化。这种方法在我的项目中效果很好。

很遗憾您使用的是MySQL。如果您正在使用几乎任何其他DBMS,则可以使用。那么您的查询将如下所示:

SELECT Master.id
 (SELECT COUNT(*) FROM Child1 WHERE Child1.id=Master.id) 
 + (SELECT COUNT(*) FROM Child2 WHERE Child2.id=Master.id) AS  score
 ORDER BY score DESC;
WITH First AS (
    SELECT id, COUNT(*) AS Cnt FROM Child1 GROUP BY id
),
Second AS (
    SELECT id, COUNT(*) AS Cnt FROM Child2 GROUP BY id
)
SELECT Master.id, First.Cnt, Second.Cnt, First.Cnt+Second.Cnt as score
    FROM Master
    INNER JOIN First ON Master.id=First.id
    INNER JOIN Second ON Master.id=Second.id
    ORDER BY score DESC;

使用此方法,您可以添加任意数量的中间子查询,也可以引用早期子查询中的列(而不仅仅是最后一个子查询中的列)。不幸的是,我不确定是否有一种方法可以单独使用MySQL来完成您的任务。

这是我编写的第一个不同缩进的查询。目前这很好,但正如我所说的,很难维护,因为我没有办法看到子查询的中间值。我想你误解了我的问题。我想保留内部别名。在这个例子中,为了使问题简短,我做了一个简单的求和。我实际上正在处理的查询使用了一个更复杂的公式,我需要查看每个子查询的值,以可靠地判断查询是如何进行的