假设有以下表格:
+----+------------------------+
| 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三列。




