2013-10-17 51 views
0

我有2個表:mysql如何做左連接,group by和計算不重複左邊的列行

CREATE TABLE `en_us` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `file_folder` varchar(6) DEFAULT NULL, 
    `file_name` varchar(200) DEFAULT NULL, 
    `file_type` varchar(200) DEFAULT NULL, 
    `actual_word` varchar(200) DEFAULT NULL, 
    `voice_type` tinyint(4) DEFAULT NULL, 
    `note` text, 
    `attention_bit` tinyint(4) DEFAULT '0', 
    `no_file` tinyint(4) DEFAULT '1', 
    `created` datetime DEFAULT NULL, 
    `updated` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `file_name_location` (`file_name`,`file_type`,`file_folder`), 
    KEY `file_name_idx` (`file_name`), 
    KEY `actual_word_idx` (`actual_word`) 
) ENGINE=InnoDB AUTO_INCREMENT=127961 DEFAULT CHARSET=utf8 | 

CREATE TABLE `en_us_tags` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `fk_en_us_id` bigint(20) NOT NULL, 
    `tag_text` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `tag_text_idx` (`tag_text`), 
    KEY `fk_en_us_id` (`fk_en_us_id`), 
    CONSTRAINT `en_us_tags_ibfk_1` FOREIGN KEY (`fk_en_us_id`) REFERENCES `en_us` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=139162 DEFAULT CHARSET=utf8 

我需要做一個LEFT JOIN加盟en_us_tagsen_us,我需要得到一個計數的唯一en_us行。

該查詢是錯誤的,因爲它返回一個計數各組,而不是:

SELECT count(*) FROM audio.en_us 
LEFT JOIN audio.en_us_tags 
ON (audio.en_us.id = audio.en_us_tags.fk_en_us_id) 
GROUP BY (audio.en_us.id); 

幫助?

編輯1 :(盜賊)這是mho錯誤。我需要總數。
而這也正是得到真實輸出:

mysql> SELECT DISTINCT COUNT(audio.en_us.id) FROM audio.en_us LEFT JOIN audio.en_us_tags ON audio.en_us.id = audio.en_us_tags.fk_en_us_id GROUP BY audio.en_us.id; 
+-----------------------+ 
| COUNT(audio.en_us.id) | 
+-----------------------+ 
|      2 | 
|      1 | 
|      3 | 
|      4 | 
|      5 | 
|      6 | 
|      7 | 
|      9 | 
+-----------------------+ 

編輯2:子查詢的方式運作,但恕我直言,作爲臨時表有點慢將建設:

SELECT COUNT(*) 
FROM (SELECT audio.en_us.id FROM audio.en_us 
LEFT JOIN audio.en_us_tags 
ON audio.en_us.id = audio.en_us_tags.fk_en_us_id 
GROUP BY audio.en_us.id) as test; 
+----------+ 
| COUNT(*) | 
+----------+ 
| 127960 | 
+----------+ 
1 row in set (0.00 sec) 

編輯3:所以 - 沒有人知道如何在不使用子查詢的情況下獲得組計數嗎? 就好像一個人有100,000行 - 創建臨時表的子查詢可能很昂貴。

+0

有沒有sqlfiddle – Strawberry

+0

nein.:-/從來沒有聽說過它。 – Dannyboy

回答

1

對於行的獨特的計數,嘗試沿着線的東西:

SELECT COUNT(id) 
FROM (
    SELECT DISTINCT * 
    FROM audio.en_us 
    LEFT JOIN audio.en_us_tags 
    ON audo.en_us.id = audio.en_us_tags.fk_en_us_id 
) t1; 

這將只返回獨特audio.en_us行數。

+0

錯誤1054(42S22):'字段列表'中的未知列'audio.en_us' – Dannyboy

+0

阿哈,我的問題。有一刻,我會更新我的答案。 – Rogue

+0

imho仍然錯誤:) – Dannyboy