2014-03-26 43 views
0

我有这样的查询,它给我关于畅销书商品的结果,目前它可以正常工作,但现在我只想从每个商店获得一个产品,以便拥有不同的si对查询计数不同的行的MySQL查询

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

任何想法:从商店

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 

这给了像亩的结果shop_id只有一个畅销的产品?

编辑 所以我创建了一个捣鼓它 http://sqlfiddle.com/#!2/cfc4c/1

现在查询返回卖得最好的,我希望它从shopso小提琴的结果只返回一个产品的产品应该是

+----+---------+-------+ 
| ID | SHOP_ID | COUNT | 
+----+---------+-------+ 
| 1 |  222 |  3 | 
| 4 |  333 |  2 | 
| 8 |  555 |  1 | 
| 9 |  777 |  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 

子查询获取项目的计数s为每个商店。然后,主查询将项目ID和项目数量连接在一起,组将单个商店的所有这些连接在一起(按降序计数),然后使用SUBSTRING_INDEX获取第一个(即第一个逗号前面的所有内容)。

您将不得不分开计数字段以分别获取物品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; 
+0

好吧mayby这会有所帮助,我创建了一个小提琴手http://sqlfiddle.com/#!2/cfc4c/1检查更新 – olechafm

+0

测试和修改,以给你所需的格式的数据。 – Kickstart

+0

不幸的是,它不在真正的数据库上... – olechafm