0

私は次のようにMySQL DBにアイテムタグを保存するクライアントのために働いています(私は知っています-理想的ではありません):

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 つの部分に分割されます: カテゴリ タイプ ブランド、カテゴリ タイプ カラー、カテゴリ タイプ スタイル、カテゴリ タイプ パターン

タグの 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

'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

私があなたの要件を正しく理解していると仮定すると、次のようなものはどうですか (想定されるテーブル構造を示すために 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

タグは区切り文字としてハイフンを使用します。特定のアイテムで使用されているタグの数を見つける方法は次のとおりです。

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

これにより、ハイフンが空の文字列に置き換えられ、長さの差が測定されます。

于 2013-01-29T14:41:27.497 に答える