我有两张桌子:
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
我需要左加入加入en_us_tags
加入en_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 :(盗贼)这是错误的。我需要总数。
这就是得到的结果:
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:子查询方法有效,但IMHO有点慢,因为临时表将被构建:
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:那么 - 有没有人知道如何在不使用子查询的情况下获得GROUPS计数? 好像有一行有100,000行 - 创建临时表的子查询可能很昂贵。
答案 0 :(得分: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行数。