Mysql 使用Count获取HTML列中最常见的前10项

Mysql 使用Count获取HTML列中最常见的前10项,mysql,Mysql,我有一个混乱的问题要解决 我有一个名为“meta_value”的列,其中包含一些HTML数据,例如: <tr class="child-row123"><td class="monsters">Monster</td><td class="monsters"><a data-name="Zure, Knight of Dark World">Zure, Kn

我有一个混乱的问题要解决

我有一个名为“meta_value”的列,其中包含一些HTML数据,例如:

<tr class="child-row123"><td class="monsters">Monster</td><td class="monsters"><a data-name="Zure, Knight of Dark World">Zure, Knight of Dark World</a> x1</br><a data-name="Dark Necrofear">Dark Necrofear</a> x1</br><a data-name="Grapha, Dragon Lord of Dark World">Grapha, Dragon Lord of Dark World</a> x3</br><a data-name="Reign-Beaux, Overlord of Dark World">Reign-Beaux, Overlord of Dark World</a> x1</br><a data-name="Goldd, Wu-Lord of Dark World">Goldd, Wu-Lord of Dark World</a> x1</br><a data-name="Sillva, Warlord of Dark World">Sillva, Warlord of Dark World</a> x3</br><a data-name="Beiige, Vanguard of Dark World">Beiige, Vanguard of Dark World</a> x2</br><a data-name="Brron, Mad King of Dark World">Brron, Mad King of Dark World</a> x3</br><a data-name="Trance Archfiend">Trance Archfiend</a> x3</br><a data-name="Kahkki, Guerilla of Dark World">Kahkki, Guerilla of Dark World</a> x3</br><a data-name="Scarr, Scout of Dark World">Scarr, Scout of Dark World</a> x2</br></td></tr><tr class="child-row123"><td class="spells">Spells</td><td class="spells"><a data-name="Dark Core">Dark Core</a> x1</br><a data-name="Dark World Dealings">Dark World Dealings</a> x2</br><a data-name="Dark World Lightning">Dark World Lightning</a> x3</br><a data-name="The Gates of Dark World">The Gates of Dark World</a> x3</br><a data-name="Gateway to Dark World">Gateway to Dark World</a> x2</br></td></tr><tr class="child-row123"><td class="traps">Traps</td><td class="traps"><a data-name="Dark Scheme">Dark Scheme</a> x1</br><a data-name="The Forces of Darkness">The Forces of Darkness</a> x1</br><a data-name="Dark Smog">Dark Smog</a> x1</br><a data-name="Dark World Brainwashing">Dark World Brainwashing</a> x3</br><a data-name="Depth Amulet">Depth Amulet</a> x1</br></td></tr><tr class="child-row123"><td class="extra">Extra</td><td class="extra"><a data-name="Number 23: Lancelot, Dark Knight of the Underworld">Number 23: Lancelot, Dark Knight of the Underworld</a> x1</br></td></tr><tr class="child-row123"><td class="id">Id</td><td class="id"></td></tr>

我想你需要一个简单的限制和顺序条款-

SELECT meta_value, COUNT(DISTINCT meta_value) VALUE_COUNT
FROM wph3_postmeta
WHERE meta_key = "deck_list"
AND meta_value REGEXP '>[[:alnum:]]+(</a>)$'
GROUP BY meta_value
ORDER BY VALUE_COUNT DESC
LIMIT 10;
选择元值、计数(不同元值)值计数
来自wph3_Posteta
其中meta_key=“deck_list”
和meta_值REGEXP'>[:alnum:]+()$'
按meta_值分组
按值排序\u计数说明
限制10;

根据执行此操作的频率和数据集的大小,我可能会将此数据提取到新表中。我将创建一个带有pk、card_name(unique)、count的表,然后在应用程序中编写一个命令,对现有数据进行迭代,解析出html中标记体或数据名属性中的名称,并创建行或更新行中的计数,然后在应用程序中进行更改,以确保在meta_值更改时更新列


这样做,并且仅仅基于计数字段进行排序,对于这个特定的查找将更有效,但是如果html的结构发生变化,它也会使这个查询仍然有效。它还允许您在这些项目中添加其他属性

以下是纯MySQL的唯一解决方案;您可以在非高峰时间每天运行此查询一次(或两次),以更新缓存/摘要表中的计数。此外,行数大约在6000(仅)左右,因此(取决于您的服务器配置),它不会导致性能问题

现在,由于特定行中的卡数是可变的(可以从40到60不等),我们可以使用序列表。您可以在数据库中定义一个永久表,存储范围从1到100的整数(您可能会发现此表在许多其他情况下也很有用):

现在,我们将在
wph3_postmeta
seq
表之间执行
JOIN
,基于特定
meta_值内子字符串
'data-name=“”
的出现计数。(也就是说,计算特定行中的卡数)使用:

现在,我们可以使用该函数提取卡值。使用不同行中的不同数字,我们基本上可以提取出第一张卡,第二张卡,等等

一旦我们把所有的单词提取出来,在不同的行中;然后,我们可以使用完整的结果集作为一个集合,并执行聚合查询以获得所需的结果:

Query()

结果

| name                                          | unique_metaid_count |
| --------------------------------------------- | ------------------- |
| Call of the Haunted                           | 2                   |
| Inferno Reckless Summon                       | 2                   |
| Mystic Box                                    | 2                   |
| Mystical Space Typhoon                        | 2                   |
| Number 39: Utopia                             | 2                   |
| #created by ygopro2                           | 1                   |
| 98095162                                      | 1                   |
| Abyss Dweller                                 | 1                   |
| Advanced Ritual Art                           | 1                   |
| Armed Dragon LV3                              | 1                   |
| Armed Dragon LV5                              | 1                   |
| Axe of Despair                                | 1                   |
| B.E.S. Covered Core                           | 1                   |
.....

| The Dragon Dwelling in the Cave               | 1                   |
| The Flute of Summoning Dragon                 | 1                   |
| The Forces of Darkness                        | 1                   |
| Threatening Roar                              | 1                   |
| Time Machine                                  | 1                   |
| Torike                                        | 1                   |
| Tornado Dragon                                | 1                   |
| Torrential Tribute                            | 1                   |
| Tragoedia                                     | 1                   |
| Trap Hole                                     | 1                   |
| Treeborn Frog                                 | 1                   |
| Trishula, Dragon of the Ice Barrier           | 1                   |
| Twin Twisters                                 | 1                   |
| Vanity's Ruler                                | 1                   |
| Wind-Up Snail                                 | 1                   |
| Wind-Up Soldier                               | 1                   |
| Wulf, Lightsworn Beast                        | 1                   |
| Zure, Knight of Dark World                    | 1                   |

注意:如果您只想要前10名(按计数),只需在查询末尾添加
限制10

对不起,我指的是行!大致来说,某一行中卡片名称的最大计数(meta_值)是多少?另外,我可以看到一张卡片,上面写着“杰瑞豆人”
;应该将其视为一张卡,还是三张卡:
Jerry
Beans
Man
?通常在特定行中插入40-60张卡,更多的是40张。杰瑞·比恩斯是一个单打球员。如澄清中所示,一张卡的标记是LANphorhynchusI,如果您有纯MySQL方法,我仍然会非常感兴趣。谢谢您的回答!不幸的是,这不是我想要的。问题是,它将在meta_值中输出完整的HTML值。正如您在上面的示例中所看到的,我必须在meta_值的HTML中搜索以提取卡名。示例:“%>LANphorhynchus%”@GenesisBits,请查看更新后的答案是否适用于您。我在OP的底部添加了一些说明,以了解我到底在寻找什么。谢谢@GenesisBits,请查看更新后的带有正则表达式的答案是否对您有所帮助。不幸的是,没有,它只返回0行。谢谢!这帮助我从一个新的角度看待它。我已经更新了我的OP来描述由于这个新的见解我已经实现的答案。非常感谢。
+-----------------------------+---------+
|            name             |  count  |
+-----------------------------+---------+
| Monster Reborn              |    2842 |
| Ash Blossom & Joyous Spring |    2587 |
| Knightmare Phoenix          |    2231 |
| Borreload Dragon            |    1975 |
+-----------------------------+---------+
SELECT meta_value, COUNT(DISTINCT meta_value) VALUE_COUNT
FROM wph3_postmeta
WHERE meta_key = "deck_list"
AND meta_value REGEXP '>[[:alnum:]]+(</a>)$'
GROUP BY meta_value
ORDER BY VALUE_COUNT DESC
LIMIT 10;
CREATE TABLE seq (n tinyint(3) UNSIGNED NOT NULL, PRIMARY KEY(n));
INSERT INTO seq (n) VALUES (1), (2), ...... , (99), (100);
(
  CHAR_LENGTH(wp.meta_value) 
  - CHAR_LENGTH(REPLACE(wp.meta_value, 'data-name=""', ''))
) / CHAR_LENGTH('data-name=""')

SELECT dt.name,
       Count(DISTINCT dt.meta_id) AS unique_metaid_count
FROM   (SELECT wp.meta_id,
               Substring_index(Substring_index(wp.meta_value, 'data-name=""',
                               -seq.n),
               '"">', 1
               ) AS name
        FROM   wph3_postmeta AS wp
               JOIN seq
                 ON ( Char_length(wp.meta_value) - Char_length(
                                                   REPLACE(wp.meta_value,
                                                   'data-name=""'
                                                        ,
                                                        '')) ) /
                         Char_length('data-name=""') >= n
        WHERE  wp.meta_key = 'deck_list') AS dt
GROUP  BY dt.name
ORDER  BY unique_metaid_count DESC  
/* To get top 10 counts only, add LIMIT 10 */
| name                                          | unique_metaid_count |
| --------------------------------------------- | ------------------- |
| Call of the Haunted                           | 2                   |
| Inferno Reckless Summon                       | 2                   |
| Mystic Box                                    | 2                   |
| Mystical Space Typhoon                        | 2                   |
| Number 39: Utopia                             | 2                   |
| #created by ygopro2                           | 1                   |
| 98095162                                      | 1                   |
| Abyss Dweller                                 | 1                   |
| Advanced Ritual Art                           | 1                   |
| Armed Dragon LV3                              | 1                   |
| Armed Dragon LV5                              | 1                   |
| Axe of Despair                                | 1                   |
| B.E.S. Covered Core                           | 1                   |
.....

| The Dragon Dwelling in the Cave               | 1                   |
| The Flute of Summoning Dragon                 | 1                   |
| The Forces of Darkness                        | 1                   |
| Threatening Roar                              | 1                   |
| Time Machine                                  | 1                   |
| Torike                                        | 1                   |
| Tornado Dragon                                | 1                   |
| Torrential Tribute                            | 1                   |
| Tragoedia                                     | 1                   |
| Trap Hole                                     | 1                   |
| Treeborn Frog                                 | 1                   |
| Trishula, Dragon of the Ice Barrier           | 1                   |
| Twin Twisters                                 | 1                   |
| Vanity's Ruler                                | 1                   |
| Wind-Up Snail                                 | 1                   |
| Wind-Up Soldier                               | 1                   |
| Wulf, Lightsworn Beast                        | 1                   |
| Zure, Knight of Dark World                    | 1                   |