繁体   English   中英

MySQL查询计数的不同行

[英]MySQL query for distinct rows on count

我有这样的查询,可以向我提供有关商店中畅销商品的结果,目前效果很好,但是现在我想从每个商店中仅获取一种产品,以便有一个独特的si shop_id只有畅销商品

SELECT  `si`.`id`, si.shop_id,
(SELECT COUNT(*) 
FROM `transaction_item` AS `tis` 
JOIN `transaction` as `t` 
ON `t`.`id` = `tis`.`transaction_id` 
WHERE `tis`.`shop_item_id` = `si`.`id` 
AND `t`.`added_date` >= '2014-02-26 00:00:00')
AS `count`
FROM `shop_item` AS `si` 
INNER JOIN `transaction_item` AS `ti` 
ON ti.shop_item_id = si.id 
GROUP BY `si`.`id` 
ORDER BY `count` DESC LIMIT 7

这给mu一个像这样的结果:

+--------+---------+-------+
|   id   | shop_id | count |
+--------+---------+-------+
| 425030 |   38027 |   111 |
| 291974 |    5368 |    20 |
| 425033 |   38027 |    18 |
| 291975 |    5368 |    12 |
| 142776 |    5368 |    10 |
| 397016 |   38027 |     9 |
| 291881 |    5368 |     8 |
+--------+---------+-------+

有任何想法吗?

编辑,所以我为此创建了一个小提琴http://sqlfiddle.com/#!2/cfc4c/1

现在查询返回最畅销的产品,我希望它只返回shopo的一种产品,fiddle的结果应该是

+----+---------+-------+
| ID | SHOP_ID | COUNT |
+----+---------+-------+
|  1 |     222 |     3 |
|  4 |     333 |     2 |
|  8 |     555 |     1 |
|  9 |     777 |     1 |
+----+---------+-------+

可能是这样的:

SELECT  si.shop_id,
    SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(':', si.id, sub1.item_count) ORDER BY sub1.item_count DESC), ',', 1) AS `count`
FROM shop_item AS si 
INNER JOIN 
(
    SELECT tis.shop_item_id, COUNT(*) AS item_count
    FROM transaction_item AS tis 
    JOIN `transaction` as t 
    ON t.id = tis.transaction_id 
    AND t.added_date >= '2014-02-26 00:00:00'
    GROUP BY tis.shop_item_id
) sub1
ON sub1.shop_item_id = si.id 
GROUP BY si.shop_id 
ORDER BY `count` DESC LIMIT 7

子查询获取每个商店的商品计数。 然后,主查询将物品ID和物品计数连接在一起,将一个商店的所有ID组合在一起(按计数降序排列),然后使用SUBSTRING_INDEX抓取第一个(即,第一个逗号之前的所有内容)。

您将必须拆分count字段以获取商品ID并单独进行计数(分隔符为:)。

这是对您真正想要的内容的一些猜测,并且没有表声明或未经测试的数据。

编辑-现在已使用SQL小提琴示例进行了测试:

SELECT SUBSTRING_INDEX(`count`, ':', 1) AS ID,
    shop_id,
    SUBSTRING_INDEX(`count`, ':', -1) AS `count`
FROM
(
    SELECT  si.shop_id,
        SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(':', si.id, sub1.item_count) ORDER BY sub1.item_count DESC), ',', 1) AS `count`
    FROM shop_item AS si 
    INNER JOIN transaction_item AS ti 
    ON ti.shop_item_id = si.id 
    INNER JOIN 
    (
        SELECT tis.shop_item_id, COUNT(*) AS item_count
        FROM transaction_item AS tis 
        JOIN `transaction` as t 
        ON t.id = tis.transaction_id 
        AND t.added_date >= '2014-02-26 00:00:00'
        GROUP BY tis.shop_item_id
    ) sub1
    ON sub1.shop_item_id = si.id 
    GROUP BY si.shop_id 

) sub2
ORDER BY `count` DESC LIMIT 7;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM