1

我有这样的查询结果 http://i.imgur.com/9m7P3mX.png

编辑:这是实际表 http://pastebin.com/TZCGHKdt

第二次编辑: http ://sqlfiddle.com/#!2/49bae/1

如果您在 SQLFIDDLE 链接中看到结果,它会在 ID 列中显示重复的条目。例如 ID 列中的值 26 共有 4 个值,查询显示它们分为 3 和 1。我希望它们加入。


这是我正在使用的表的插入查询

    INSERT INTO `capture_captive` (`capture_id_1`, `capture_id_2`, `capture_id_3`,      `capture_id_4`, `capture_id_5`)
 VALUES
(23, 32, 0, 0, 0),
(26, 25, 24, 0, 15),
(26, 32, 0, 0, 0),
(0, 0, 0, 0, 0),
(26, 26, 0, 0, 0),
(32, 32, 0, 0, 0);

我正在使用的查询是

    select id, num from 
    (select `capture_id_1` id, (COUNT(capture_id_1)) num from capture_captive where capture_id_1<>0 group by capture_id_1 
    UNION
    select `capture_id_2`, (COUNT(capture_id_2)) num from capture_captive where capture_id_2<>0 group by capture_id_2
    UNION
    select `capture_id_3`, (COUNT(capture_id_3)) num from capture_captive where capture_id_3<>0 group by capture_id_3
    UNION
    select `capture_id_4`, (COUNT(capture_id_4)) num from capture_captive where capture_id_4<>0 group by capture_id_4 
    UNION
    select `capture_id_5`, (COUNT(capture_id_5)) num from capture_captive where capture_id_5<>0 group by capture_id_5 ) as E
    where id<>0
    order by id;

我想根据他们的 id 显示 id 的总数。

提前致谢。

4

3 回答 3

1

有人可能会说这应该是一个评论,但是......

您的主要问题不在于查询本身。你有一个标准化问题。正如您自己发现的那样,这个问题会导致次优查询。

您应该明确考虑重构您的数据表。这是一个可能的“等价物”(参见http://sqlfiddle.com/#!2/759b9/2):

CREATE TABLE `capture_captive_norm` (`capture_group` int not null,
                                `capture_id` int not null,
                                `value` int,
                                    PRIMARY KEY (`capture_group`, `capture_id`));

INSERT INTO `capture_captive_norm` (`capture_group`, `capture_id`, `value`)
 VALUES
(1,1,23), (1,2,32), (1,3,0), (1,4,0), (1,5,0),
(2,1,26), (2,2,25), (2,3,24), (2,4,0), (2,5,15),
(3,1,26), (3,2,32), (3,3,0), (3,4,0), (3,5,0),
(4,1,0), (4,2,0), (4,3,0), (4,4,0), (4,5,0),
(5,1,26), (5,2,26), (5,3,0), (5,4,0), (5,5,0),
(6,1,32), (6,2,32), (6,3,0), (6,4,0), (6,5,0);

我同意这看起来更复杂。但:

我想根据他们的 id 显示 id 的总数。

现在简单地说:

SELECT `capture_id`, COUNT(IF(`value` <> 0, 1, NULL))
FROM `capture_captive_norm`
GROUP BY `capture_id`;

生产:

+-------------+----------------------------------+
| CAPTURE_ID  | COUNT(IF(`VALUE` <> 0, 1, NULL)) |
+-------------+----------------------------------+
|          1  |                                5 |
|          2  |                                5 |
|          3  |                                1 |
|          4  |                                0 |
|          5  |                                1 |
+-------------+----------------------------------+

如您所知,基于该示例,您现在可以轻松地查询该表以按值或按 id的值来计数捕获

请注意,通过使用特殊的 NULL 值来表示不存在的数据,这可能已缩短为:

SELECT `capture_id`, COUNT(`value`)
FROM `capture_captive_norm`
GROUP BY `capture_id`;

嗯......事实上,有了这个sheme,你不必为缺失值插入NULL。如果你只是“不插入它们”,当然COUNT() 不会计算它们......

于 2013-08-20T08:34:04.437 回答
1

刚刚找到了我自己问题的答案。我错过了一个非常基本的函数 SUM()。可能需要休息一下。

这是它的链接。 http://sqlfiddle.com/#!2/49bae/2

希望能帮助到你

于 2013-08-20T11:33:51.907 回答
1

如果您想保留原始表结构,以下查询应该会产生预期的结果,需要的临时表和文件排序比您建议的要少得多。查看http://sqlfiddle.com/#!2/49bae/4对两者进行比较(点击“查看执行计划”查看查询执行计划):

SELECT `id`, COUNT(*)
FROM (
  SELECT `capture_id_1` as `id` FROM `capture_captive`
  UNION ALL SELECT `capture_id_2` FROM `capture_captive`
  UNION ALL SELECT `capture_id_3` FROM `capture_captive`
  UNION ALL SELECT `capture_id_4` FROM `capture_captive`
  UNION ALL SELECT `capture_id_5` FROM `capture_captive`
  ) AS S
WHERE `id` <> 0
GROUP BY `id`
ORDER BY `id`
于 2013-08-20T12:17:46.857 回答