2013-08-20 134 views
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

的,什麼是不工作或者是什麼問題? –

+1

請勿使用圖像文件來描述您的數據/表格。或者提供相關數據作爲SQL(與您一樣) - 此外,您可以提供與您的問題相對應的http://sqlfiddle.com/。 –

+0

請檢查第二次更新。 –

回答

1

剛剛找到了我自己的問題的答案。我錯過了一個非常基本的函數SUM()。可能需要休息。

這裏是它的鏈接。 http://sqlfiddle.com/#!2/49bae/2

希望它可以幫助

+0

'SUM()'顯然是一個選項。我沒有時間詳細檢查,但正如你所建議的那樣,它需要一個臨時表+文件夾用於*每個*子選擇。根據您的需要,數據庫的額外負載可能會或可能不會成爲問題。我發佈了一個替代答案*可能*更「服務器友好」。 –

+0

是的,我不會有服務器加載問題。 –

1

也許有人會說,這應該是一個評論,但是......

你這裏主要的問題是不與查詢本身。你有一個normalization的問題。這個問題會導致您發現自己的次優查詢。

您應該明確考慮重新考慮數據表。這裏是一個可能的 「等價物」(見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 | 
+-------------+----------------------------------+ 

正如你瞭解的基礎上,這個例子中,你可能現在容易查詢該表來算捕獲由價值價值編號

請注意,通過使用特殊的NULL值來表示不存在的數據,這可能已經縮短到:

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

嗯......其實,這個sheme,你不必須插入對於缺失值爲NULL。如果你只是「不要插入它們」,當然COUNT()將不會算他們...

+0

你如何建議我這樣做? –

+0

@ahsanzaheer查看我的編輯;) –

+0

其實我插入的插入只是表格的一半。讓我用實際表格編輯問題 –

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`