Mysql 查询展开并计数
Mysql query explode and count
我有 table 这样的:
product_id model date computers
----------------------------------------------------------------
12204 Asus 'random_date' :::aass:::ddff:::ddfd:::dfwr:::
12205 Acer 'random_date' :::ersz:::dfwqq:::bbs:::
12205 Acer 'random_date' :::ettww:::iwoeur:::iwerq:::
如您所见,product_id,模型可以复制。 Computers 字段包含当前行中有多少台计算机。分隔符是 :::。在我对它们进行分组 (GROUP BY product_id) 之后,第一个产品 (12204) 中有 3 台计算机,而其他产品 (12205) 中有 6 台计算机。所以查询结果一定是这样的:
GROUP(product_id) model count
-----------------------------------------
12204 Asus 4
12205 Acer 6
是否可以通过单个查询来完成?或者我必须在后端代码中执行此操作(在我的情况下 python)?
(我无法修改table,我正在处理别人已经存在的table)
编辑:更新了示例数据格式
尝试以下查询:
SELECT product_id, model,
SUM(1 + ((LENGTH(computers) - LENGTH(REPLACE(computers, ':::', ''))) / 3)) AS count
FROM products
GROUP BY product_id, model
单击下面的 link 进行 运行 演示:
对计数字段使用 SUM
、ROUND
、LENGTH
、REPLACE
和 COUNT
的组合,然后按 product_id 和模型。
SELECT product_id, model,
SUM(ROUND ((LENGTH(computers) - LENGTH(REPLACE(computers, ":::", ""))) / LENGTH(":::"))) - count(product_id) AS count
FROM yourtable
GROUP BY product_id, model
输出
product_id model count
12204 Asus 4
12205 Acer 6
SQL Fiddle:http://sqlfiddle.com/#!9/ad183/2/0
SELECT product_id, model,
CAST(SUM(1 + ((LENGTH(TRIM(BOTH ":::" FROM computers)) - LENGTH(REPLACE(TRIM(BOTH ":::" FROM computers), ":::", ""))) / 3)) AS UNSIGNED) AS cnt
FROM products
GROUP BY product_id, model
我有 table 这样的:
product_id model date computers
----------------------------------------------------------------
12204 Asus 'random_date' :::aass:::ddff:::ddfd:::dfwr:::
12205 Acer 'random_date' :::ersz:::dfwqq:::bbs:::
12205 Acer 'random_date' :::ettww:::iwoeur:::iwerq:::
如您所见,product_id,模型可以复制。 Computers 字段包含当前行中有多少台计算机。分隔符是 :::。在我对它们进行分组 (GROUP BY product_id) 之后,第一个产品 (12204) 中有 3 台计算机,而其他产品 (12205) 中有 6 台计算机。所以查询结果一定是这样的:
GROUP(product_id) model count
-----------------------------------------
12204 Asus 4
12205 Acer 6
是否可以通过单个查询来完成?或者我必须在后端代码中执行此操作(在我的情况下 python)?
(我无法修改table,我正在处理别人已经存在的table)
编辑:更新了示例数据格式
尝试以下查询:
SELECT product_id, model,
SUM(1 + ((LENGTH(computers) - LENGTH(REPLACE(computers, ':::', ''))) / 3)) AS count
FROM products
GROUP BY product_id, model
单击下面的 link 进行 运行 演示:
对计数字段使用 SUM
、ROUND
、LENGTH
、REPLACE
和 COUNT
的组合,然后按 product_id 和模型。
SELECT product_id, model,
SUM(ROUND ((LENGTH(computers) - LENGTH(REPLACE(computers, ":::", ""))) / LENGTH(":::"))) - count(product_id) AS count
FROM yourtable
GROUP BY product_id, model
输出
product_id model count
12204 Asus 4
12205 Acer 6
SQL Fiddle:http://sqlfiddle.com/#!9/ad183/2/0
SELECT product_id, model,
CAST(SUM(1 + ((LENGTH(TRIM(BOTH ":::" FROM computers)) - LENGTH(REPLACE(TRIM(BOTH ":::" FROM computers), ":::", ""))) / 3)) AS UNSIGNED) AS cnt
FROM products
GROUP BY product_id, model