Mysql数据库一个字段内多个值如何统计个数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据库一个字段内多个值如何统计个数相关的知识,希望对你有一定的参考价值。
MySQL中(person)表中的一个字段Name是多值逗号分隔的,如下:
select name form person;
Name
-----------------------------------------
a,b,c
a,b
a,c
想要的结果是下图,即要每个名称的个数有多少
名称 个数
-------------------
a 3
b 2
c 2
CREATE TABLE person (
name varchar(20)
);
INSERT INTO person VALUES ('a,b,c');
INSERT INTO person VALUES ('a,b');
INSERT INTO person VALUES ('a,c');
DELIMITER //
DROP FUNCTION GetTextCount //
/**********
-- 获取字符串中有几个部分.
**********/
CREATE FUNCTION GetTextCount(pSourceText VARCHAR(255), pDivChar CHAR(1))
RETURNS TINYINT
BEGIN
-- 预期结果.
DECLARE vResult TINYINT;
-- 当前逗号的位置.
DECLARE vIndex INT;
-- 前一个逗号的位置.
DECLARE vPrevIndex INT;
-- 结果的初始值.
SET vResult = 1;
-- 查询第一个 逗号的位置.
SET vIndex = INSTR(pSourceText, pDivChar);
IF vIndex = 0 THEN
-- 参数中没有逗号,直接返回.
RETURN vResult;
END IF;
-- 初始化情况,前一个逗号不存在.
SET vPrevIndex = 0;
-- 循环处理。
WHILE vIndex > 0 DO
-- 结果递增.
SET vResult = vResult + 1;
-- 前一个逗号的位置 = 当前逗号的位置
SET vPrevIndex = vIndex;
-- 查询下一个逗号的位置.
SET vIndex = LOCATE(pDivChar, pSourceText, vPrevIndex + 1);
END WHILE;
-- 返回结果.
RETURN vResult;
END;
//
DROP FUNCTION GetTextValue //
/**********
-- 获取字符串中具体某一个部分的数据.
**********/
CREATE FUNCTION GetTextValue(pSourceText VARCHAR(255), pDivChar CHAR(1), pIndex TINYINT)
RETURNS VARCHAR(255)
BEGIN
-- 预期结果.
DECLARE vResult VARCHAR(255);
IF pIndex = 1 THEN
SELECT SUBSTRING_INDEX(pSourceText, pDivChar, 1) INTO vResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText, pDivChar, pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText, pDivChar, pIndex - 1) , pDivChar),
'') INTO vResult;
END IF;
-- 返回.
RETURN vResult;
END;
//
DELIMITER ;
SELECT
GetTextValue(t.name, ',', MaxNum.No) AS `名称`,
COUNT(*) AS `个数`
FROM
person t,
(SELECT 1 No UNION ALL
SELECT 2 No UNION ALL
SELECT 3 No UNION ALL
SELECT 4 No UNION ALL
SELECT 5 No ) MaxNum
WHERE
GetTextCount(t.name, ',') >= MaxNum.No
GROUP BY
GetTextValue(t.name, ',', MaxNum.No);
+------+------+
| 名称 | 个数 |
+------+------+
| a | 3 |
| b | 2 |
| c | 2 |
+------+------+
3 rows in set (0.01 sec) 参考技术A 含有a的名称的个数:
select count(*) from person where Name like '%a%';
b和c同理 参考技术B 使用count方法 参考技术C 告诉你思路,先拿到每个数据,以“,”作为分隔符生成字符串数组
然后分析数组里面的值,进行累加
JAVA PHP c++等语言算法自己琢磨
如何在单个字段或列中连接多个值? (MySQL)
【中文标题】如何在单个字段或列中连接多个值? (MySQL)【英文标题】:How can I concatenate multiple values in a single field or column? (MySQL) 【发布时间】:2014-10-13 10:53:35 【问题描述】:我在 MySQL 中有一个需要分组的表。我正在检索订购了多个商品的销售订单
我当前的数据库查询如下所示:
如您所见,销售订单 255 购买了 2 件商品,而销售订单 300 购买了 3 件商品
问题:我需要在 line_items 字段或根据 order_id 的列中连接所有 product_id 及其价格
我想要的输出是这样的:
这是我使用的查询:
SELECT bsb.ORDER_ID AS order_id, bsb.PRODUCT_ID AS product_id, bsb.PRICE AS product_price, '' AS line_items
FROM bsb
INNER JOIN bso ON bso.ID = bsb. ORDER_ID
WHERE bsb.ORDER_ID in(255, 300)
请帮帮我...
【问题讨论】:
【参考方案1】:您可以在GROUP_CONCAT
中使用CONCAT
来获得所需的结果集,但请记住GROUP_CONCAT
的默认连接字符数为1024 个,但可以按照GROUP_CONCAT
手册增加它
SELECT bsb.ORDER_ID AS order_id,
GROUP_CONCAT(CONCAT('product_id: ',bsb.PRODUCT_ID,' | ',bsb.PRICE) SEPARATOR ';') AS line_items
FROM bsb
INNER JOIN bso ON bso.ID = bsb. ORDER_ID
WHERE bsb.ORDER_ID in(255, 300)
GROUP BY bsb.ORDER_ID
【讨论】:
嗨哈立德,感谢您的回复。你的答案是正确的。你真棒! :)以上是关于Mysql数据库一个字段内多个值如何统计个数的主要内容,如果未能解决你的问题,请参考以下文章