基于聚合子数据确定父级别的困难MySQL查询

时间:2014-05-27 21:55:58

标签: mysql sql

我需要一个单一的查询,根据它在所有父母中的排名,可以为我提供父母的排名。该等级由父母的孩子的得分字段的总和确定。

这是MYSQL表设置:

CREATE TABLE `parent` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `child` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `name` varchar(30) NOT NULL,
  `score` decimal(6,4) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

我可以使用以下方法轻松找到所有孩子中特定孩子的等级:

SELECT c1.id,c1.name,c1.score,COUNT(c2.id) AS 'rank'
FROM child c1
JOIN child c2
ON c1.score <= c2.score
WHERE c1.id=3;

我能弄清楚的是如何根据每个父母的得分字段的总和来找到所有父母中特定父母的等级&#39;儿童。我正在寻找的SQL查询应该根据传入其ID来返回父级别。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

  1. 如果parent_id上没有索引,请尝试在其中添加一个索引。它应该加速连接。

  2. 我相信以下内容可以满足您的需求:

    SELECT COUNT(*) AS rank FROM (
      SELECT SUM(c.score) AS parentScore
        FROM child
      GROUP BY parent_id
         HAVING parentScore <= (SELECT SUM(c.score) FROM child WHERE parent_id = _PARENT_ID)
    ) AS scores
    

    子查询只执行一次,因为它不依赖于封闭查询。这应该可以最大限度地减少通过桌子这并不能解释分数的关系。如果你想处理它,你可以选择不同的分数。

答案 1 :(得分:0)

select p.id, p.name, ps.score, count(ps2.score) as 'rank'
from parent p
join (
  select pp.id as 'id', sum(c.score) as 'score'
  from parent pp
  join child c on pp.id = c.parent_id
  group by pp.id
) as 'ps' on p.id = ps.id
join (
  select pp.id as 'id', sum(c.score) as 'score'
  from parent pp
  join child c on pp.id = c.parent_id
  group by pp.id
) as 'ps2' on ps.score <= ps2.score
where p.id = 3;

你最后可能需要:

group by p.id, p.name, ps.score