我有两张桌子:z_words
和z_words_products
。你可以看到下面这些表的结构。
在z_words_products
表中,可以使用相同的值:
wordId
、smaId
、productId
、siteId
和type
值不同。
我想要的,得到一个数字,一个数。我想知道,在我的表中有多少个单词,但一个产品中有一个单词,即使是在一个产品中发生了两次。
例如:
SELECT `zw`.`word`, `zwp`.`smaId`, COUNT(*) AS `cnt`
FROM `z_words` `zw`
INNER JOIN `z_words_products` `zwp` ON `zwp`.`wordId` = `zw`.`id`
WHERE `zwp`.`siteId` = 0
AND `zwp`.`smaId` = 1
GROUP BY `zw`.`word`, `zwp`.`smaId`
输出
+--------------+-------+-----+
| word | smaId | cnt |
+--------------+-------+-----+
| 8100 | 1 | 1 |
| 8102wlci | 1 | 1 |
| 8104wlmi | 1 | 1 |
| Acer | 1 | 2 |
| unknown | 1 | 1 |
+--------------+-------+-----+
正如您所看到的,宏碁发生了孪生现象,因为它与类型A
和类型B
一起出现,但在最终结果中,我应该将其计算为1。
因此,我的最后查询结果应该是5,而不是6。当然,我的表中有很多产品。
我试过这个:
SELECT COUNT(cnt) FROM (
SELECT `zw`.`id` AS `cnt`
FROM `z_words` `zw`
INNER JOIN `z_words_products` `zwp` ON `zwp`.`wordId` = `zw`.`id`
WHERE `zwp`.`siteId` = 0
AND `zwp`.`smaId` = 1
GROUP BY `zw`.`word`, `zwp`.`smaId`)
AS xxx
它有效,给我正确的结果。我的问题是,当我在所有的产品上运行它时,它只需6-7分钟。
还有别的方法能更快地得到结果吗?
在z_words_products
中有6 147 059条记录,在z_words
表中是367 771条
查询的内容:
+----+-------------+------------+--------+-----------------------------------------------+--------------+---------+------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+-----------------------------------------------+--------------+---------+------------------------+------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | \N | \N | \N | \N | 14 | |
| 2 | DERIVED | zwp | ref | PRIMARY,siteId_smaId,wordId,wordId_2,wordId_3 | siteId_smaId | 8 | const,const | 14 | Using index; Using temporary; Using filesort |
| 2 | DERIVED | zw | eq_ref | PRIMARY | PRIMARY | 4 | partcollect.zwp.wordId | 1 | |
+----+-------------+------------+--------+-----------------------------------------------+--------------+---------+------------------------+------+----------------------------------------------+
表
CREATE TABLE `z_words` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`word` varchar(255) DEFAULT NULL,
`translated` varchar(255) DEFAULT NULL,
`transTry` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `word` (`word`)
) ENGINE=InnoDB AUTO_INCREMENT=526303 DEFAULT CHARSET=utf8
CREATE TABLE `z_words_products` (
`wordId` int(11) NOT NULL,
`smaId` int(11) NOT NULL,
`productId` int(11) NOT NULL,
`type` enum('word','compatible','partNumber','tag','model') NOT NULL,
`siteId` int(11) NOT NULL DEFAULT '0',
`order` int(11) DEFAULT NULL,
PRIMARY KEY (`wordId`,`smaId`,`productId`,`type`,`siteId`),
KEY `siteId_smaId` (`siteId`,`smaId`),
KEY `wordId` (`wordId`,`productId`),
KEY `wordId_2` (`wordId`,`order`),
KEY `wordId_3` (`wordId`),
KEY `wordId_4` (`productId`,`order`),
CONSTRAINT `z_words_products_ibfk_1` FOREIGN KEY (`wordId`) REFERENCES `z_words` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
发布于 2017-01-23 17:10:36
您应该能够在适当的列上使用SELECT COUNT(DISTINCT...)
在z_words_products
表上编写查询,而忽略了type
列。
很难确切地知道如何定义计数,但根据两个示例查询,您似乎希望为给定的wordId
对计算不同的(sitId,smaId)
值。
如果这个假设是正确的,那么这个查询应该适用于您:
SELECT count(distinct `zwp`.`wordId`)
FROM `z_words_products` `zwp`
WHERE `zwp`.`siteId` = 0
AND `zwp`.`smaId` = 1;
https://stackoverflow.com/questions/41811117
复制相似问题