【问题标题】:How to get the most frequent values from a column using mysql如何使用mysql从列中获取最频繁的值
【发布时间】:2018-08-04 12:29:47
【问题描述】:

我想从数据库中获取订购次数最多的商品。

例如:我有一个下表:

S.no-----Name--------Items

1---------rob------------Pen, pencil, rubber

2---------jim------------rubber, scissor

3--------rick------------pen,pencil

我想获取订购次数最多的商品,如下所示

S.no---item-------Count

1------Pen---------2

2------Pencil------2

3------Rubber------1

4------Scissor-----1

下面是我正在使用的查询

SELECT name, items, count(items) AS cnt FROM tbl_orderitem GROUP BY items ORDER BY cnt DESC

但我无法达到我想要的结果

【问题讨论】:

  • 你使用什么编程语言来访问mysql?你也可以列出你正在使用的表格列吗?
  • 你有一张桌子,里面放着所有的东西吗?如果是,那很有可能。
  • 您的架构看起来一团糟。向我们展示表定义。
  • 第 1 步。参见规范化。
  • 但是规范化建议是最好的步骤,因为我已经在数据结构中看到了Penpen。规范化的问题是应用程序代码也需要更新以支持它。为什么不应该在数据库中使用逗号分隔值stackoverflow.com/questions/3653462/…

标签: mysql sql


【解决方案1】:

这是一种方法。您需要将这些项目分成几行。
然后,您可以从中分组和计数。

下面的示例 SQL 仅使用 4 个数字的子查询。
但这可以用只有数字的理货表代替。

可以找到一个Sql Fiddle测试here

SELECT
  TRIM(
    LOWER(
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(Items, ',', numbers.n), ',', -1))) AS Item,
  COUNT(*) AS Total
FROM testtable
JOIN (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers 
  ON CHAR_LENGTH(Items)-CHAR_LENGTH(REPLACE(Items,',','')) >= numbers.n-1
GROUP BY Item
ORDER BY Total DESC;

【讨论】:

  • @Peace 请注意,这是一个适用于 MySql 5.x 的解决方案。但我相信这可以在 MySql 8.x 或 MariaDB 中以不同的方式完成。
  • @Peace 只是一个警告。如果每个用户有超过 3 个项目。不要忘记数字需要的不仅仅是 4。这毕竟只是一个例子。最好使用仅包含数字而不是子查询的永久表。
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多