【问题标题】:MySQL query for distinct rows on countMySQL查询不同行的计数
【发布时间】:2014-03-26 10:57:33
【问题描述】:

我有这样的查询,它给了我关于商店畅销商品的结果,目前它工作正常,但现在我想从每家商店只获得一种产品,以便有一个独特的 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

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

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

【问题讨论】:

  • 请提供一些样本数据和期望的结果。你怎么知道交易中有哪些项目?

标签: mysql select


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

您必须拆分计数字段以分别获取项目 ID 和计数(分隔符为 : )。

这是对您真正想要的东西的一些猜测,并且没有表声明或数据,它没有经过测试。

编辑 - 现在使用 SQL fiddle 示例进行测试:-

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;

【讨论】:

  • 好吧,也许这会有所帮助,我创建了一个 Fiddle uder sqlfiddle.com/#!2/cfc4c/1 检查更新
  • 经过测试和修改,为您提供所需格式的数据。
  • 您能否更新 SQL fiddle 来演示该问题。
  • 这将很难找到,因为我简化了这些表中的数据结构只是为了拥有必要的字段......如果一个事务中可以有很多产品,它会改变什么吗?
  • 不这么认为,尽管查看 SQL 我认为我可以删除 transaction_item 的连接之一(现在修改了我的代码)
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多