ZBLOG

mysql 根据最多的数量获取多少条 SUBSTRING_INDEX

假设有以下表格:

+----+------------------------+
| id |         fruits         |
+----+------------------------+
|  1 | apple,banana,orange    |
|  2 | mango,pineapple        |
|  3 | strawberry,grape,kiwi  |
+----+------------------------+

如果需要根据fruits列中数量最多的水果获取指定行数的数据,可以使用如下SQL语句:

SELECT 
  id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(fruits, ',', 1), ',', -1) AS fruit1,
  SUBSTRING_INDEX(SUBSTRING_INDEX(fruits, ',', 2), ',', -1) AS fruit2,
  SUBSTRING_INDEX(SUBSTRING_INDEX(fruits, ',', 3), ',', -1) AS fruit3
FROM
  table_name
WHERE 
  (LENGTH(fruits) - LENGTH(REPLACE(fruits, ',', '')) + 1) = (
    SELECT MAX(cnt)
    FROM (
      SELECT LENGTH(fruits) - LENGTH(REPLACE(fruits, ',', '')) + 1 AS cnt
      FROM table_name
    ) AS t
  )
LIMIT 10;

解释一下上述语句:

  • LENGTH(str) 函数返回字符串str的长度。例如,LENGTH(‘apple,banana’) 返回11。
  • REPLACE(str, from_str, to_str) 函数将字符串str中所有的from_str替换为to_str。例如,REPLACE(‘apple,banana,orange’, ‘,’, ‘;’) 返回’apple;banana;orange’。
  • COUNT(expr) 函数返回expr列中非NULL值的数量。
  • 上述语句中先使用子查询找出fruits列中数量最多的水果的数量,再使用LENGTH和REPLACE函数计算fruits列中逗号的数量,找出与最多水果数量相等的行。最后使用SUBSTRING_INDEX将fruits列分割成多列。LIMIT 10表示获取10行数据,可以根据实际需求进行调整。

如果执行以上SQL语句,得到的结果如下:

+----+---------+---------+-----------+
| id | fruit1  |  fruit2 |   fruit3   |
+----+---------+---------+-----------+
|  1 | apple   | banana  | orange    |
|  3 | strawberry | grape | kiwi     |
+----+---------+---------+-----------+

可以看到,只返回了数量最多的水果的数量对应的行数,并且把fruits列按逗号分割成了fruit1、fruit2和fruit3三列。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1469

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?