0

我正在为一个在 MySQL 数据库中存储项目标签的客户工作(我知道,我知道 - 不理想):

coats_and_jackets-Woven_Jacket-brand:Hobbs;
coats_and_jackets-Woven_Jacket-color:Black;
coats_and_jackets-Woven_Jacket-style:Boucle;
coats_and_jackets-Woven_Jacket-pattern:Plain;
dresses-Pinafore-brand:COS;
dresses-Pinafore-color:Blue _ Navy;
dresses-Pinafore-style:Wool;
dresses-Pinafore-pattern:Plain;
shoes-Ankle_Boot-brand:Topshop;
shoes-Ankle_Boot-color:Black;
shoes-Ankle_Boot-style:Leather;
shoes-Ankle_Boot-pattern:Plain;
bags-Tote-brand:Mulberry;
bags-Tote-color:Brown _ Tan;
bags-Tote-style:Leather;
bags-Tote-pattern:Plain;
shoes-Ballet_shoes-brand:Chanel;
shoes-Ballet_shoes-color:Black;
shoes-Ballet_shoes-style:Leather;
shoes-Ballet_shoes-pattern:Plain;
accessories-Scarf-brand:Zara;
accessories-Scarf-color:Brown _ Tan;
accessories-Scarf-style:Wool;
accessories-Scarf-pattern:Checked;

每个标签分为 4 个部分,如下所示:category-type-brand、category-type-color、category-type-style、category-type-pattern

并非标签的所有 4 个部分都是必需的,并且可以从 DB 中省略。

我的任务是找出一个项目有多少个标签,所以在这个例子中使用了 6 个标签,每个标签都有 4 个部分。

到目前为止,我的查询计算了所有标签部分,在本例中为 24,但我不能假设每个标签都会存储所有 4 个部分。所以不能将零件数量除以4来得到标签的数量。

在本例中,使用的 6 个标签如下:

大衣和夹克(梭织夹克) 连衣裙(围裙) 鞋履(踝靴) 包袋(手提包) 鞋履(芭蕾舞鞋) 配饰(围巾)

现在我不关心类别、类型或部件(品牌、颜色、样式、图案)——我只关心获取该项目的标签总数。

此外,上面的数据示例将存储在 db 行中,如下所示:

+----------+-------------+----------------------------+
|  ID      | meta_key    |   meta_value               |
+----------+-------------+----------------------------+
|        1 |   tags      |  coats_and_jackets-wove... |
+----------+-------------+----------------------------+
|        2 |   item_desc |  Fashion editor            |
+----------+-------------+----------------------------+

帮助构建此查询将不胜感激。

4

3 回答 3

0

假设我正确理解了您的要求,那么这样的事情怎么样(使用 CTE 来演示假定的表结构)

WITH CTE1(tag) AS(
    select 'coats_and_jackets-Woven_Jacket-brand:Hobbs' union
    -- ...
    select 'accessories-Scarf-color:Brown _ Tan' union
    select 'accessories-Scarf-style:Wool' union
    select 'accessories-Scarf-pattern:Checked'
)
, CTE2(tag_prefix) AS(
    select LEFT(tag, CHARINDEX('-', tag, CHARINDEX('-', tag) + 1) - 1) from CTE1
)
select tag_prefix, COUNT(*) from CTE2 group by tag_prefix

这将为您提供...的结果

accessories-Scarf   4
bags-Tote   4
coats_and_jackets-Woven_Jacket  4
dresses-Pinafore    4
shoes-Ankle_Boot    4
shoes-Ballet_shoes  4

...它为您提供标签前缀和使用的零件数量。从那里您可以计算各个行或总结零件的数量或您需要的任何其他内容......

于 2013-01-29T14:53:04.730 回答
0

我刚刚意识到我的解决方案完全没有意义,因为我错过了“mysql”标签;)但无论如何我都会把它贴在这里。希望它可以为您提供有关如何进行的指示。

WITH CTE1(ID, meta_key, meta_value) AS(
    select 1, 'tags', 'coats_and_jackets-Wo...' union all
    select 2, 'item_desc', 'Fashion editor'
)
, TagsCTE AS(
    select t.ID, x.Item as tag_and_value
    from CTE1 t
    cross apply dbo.fn_SplitString(t.meta_value, ';') x
    where meta_key = 'tags' and LEN(x.Item) > 0
)
select ID, COUNT(parts_count) from (
    select ID, COUNT(*) as parts_count
    from TagsCTE
    group by ID, LEFT(tag_and_value, CHARINDEX('-', tag_and_value, CHARINDEX('-', tag_and_value) + 1) - 1)
) a group by ID

这给出了以下结果:

1   6

祝你好运。

于 2013-01-29T16:39:11.973 回答
0

标签使用连字符作为分隔符。这是一种查找给定项目使用的标签数量的方法:

select it.*, length(it.tags) - length(replace(it.tags, '-', ''))+1
from itemtags it

这将用空字符串替换连字符,并测量长度差异。

于 2013-01-29T14:41:27.497 回答