0

我有两张桌子:

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_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:(流氓)那是错误的。我需要总数。
这就是得到的输出:

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:那么 - 有没有人知道不使用子查询来获得 GROUPS 计数的方法? 好像一个人有 100,000 行 - 创建临时表的子查询可能很昂贵。

4

1 回答 1

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 行数。

于 2013-10-17T17:10:31.903 回答