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 进行 运行 演示:

SQLFiddle

对计数字段使用 SUMROUNDLENGTHREPLACECOUNT 的组合,然后按 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

SQLFIDDLE