MySQL查询计数中的不同行

时间:2014-03-26 10:57:34

标签: mysql select

我有这样的查询,它提供了关于商店畅销商品的结果,目前工作正常,但现在我想从每个商店只获得一个产品,以便有一个独特的si。{{1只有一个商店的畅销产品

shop_id

这给了mu一个像:

的结果
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

任何想法?

EDIT 所以我为它创造了一个小提琴 http://sqlfiddle.com/#!2/cfc4c/1

现在查询返回最畅销的产品,我希望它只从商店返回一个产品,小提琴的结果应该是

+--------+---------+-------+
|   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 |
+--------+---------+-------+

1 个答案:

答案 0 :(得分:0)

可能是这样的: -

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和项目计数连接在一起,组将所有这些连接在一起(按计数降序排序),然后使用SUBSTRING_INDEX获取第一个(即第一个逗号之前的所有内容)。 / p>

您必须拆分计数字段以分别获取项目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;
相关问题