我有一个凌乱的查询尝试找出。
我有一列称为“ 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>
Run Code Online (Sandbox Code Playgroud)
我有6000多个这样的行,并且我试图找到在它们中找到的前10个最频繁的值,而不会杀死服务器。
例如,通过执行以下操作,我可以发现一张名为“ LANphorhynchus”的卡出现了多少次:
SELECT COUNT(DISTINCT(meta_value))
FROM wph3_postmeta
WHERE meta_value LIKE "%>LANphorhynchus</a>%"
AND meta_key = "deck_list"
Run Code Online (Sandbox Code Playgroud)
太好了!但是我想尝试找出前10名,但我不知道哪些名字在前10名中。
这甚至应该在MySQL中执行吗?
澄清:
如上所述,meta_value列包含完整的HTML标记。每个卡名的插入位置为:
<a data-name="LANphorhynchus">LANphorhynchus</a>
Run Code Online (Sandbox Code Playgroud)
并且每一行在此meta_value列中都有多个卡名称(请参见顶部,以获取连续数据的完整示例)。因此,"%>LANphorhynchus</a>%"如果需要特定的卡,我将在MySQL中进行搜索(我需要在标签之间进行搜索)。
然而。我想尝试从我不知道卡名称的所有行中获取在此列中找到的前10张卡。因此,我可能认为可能需要一些正则表达式才能在每行的标签之间进行搜索,并找出最常出现的卡片?
数据库行的提取:https : //docs.google.com/spreadsheets/d/1625ha8zGlCGvVnRa8N3cwpqVqg1JxF5mT8i04CENRWc/edit?usp=sharing
解答: 感谢Midwinter86,我能够从一个新的角度看待这个问题。
我所做的如下。
对数据库中访问量最高的100张卡片执行查询,然后将名称插入数组。
在一个循环中,针对
meta_values表检查每个名称,以查看它们出现的频率(使用上面的我的LANphorhynchus示例)。将所有数据提取到新表top_10_cards中。
将数据缓存1周,然后重新运行。
输出:
+-----------------------------+---------+
| name | count |
+-----------------------------+---------+
| Monster Reborn | 2842 |
| Ash Blossom & Joyous Spring | 2587 |
| Knightmare Phoenix | 2231 |
| Borreload Dragon | 1975 |
+-----------------------------+---------+
Run Code Online (Sandbox Code Playgroud)
以下是纯MySQL解决方案;您可以在非高峰时段每天运行一次此查询(或两次),以更新缓存/摘要表中的计数。此外,行数大约是6000左右(只),所以(取决于你的服务器配置),它应该不会导致性能问题。
现在,由于特定行中的纸牌数量是可变的(范围为40-60),因此我们可以使用序列表。您可以在数据库中定义一个永久表,该表存储从1到100的整数(在许多其他情况下,您可能会发现此表也很有用):
CREATE TABLE seq (n tinyint(3) UNSIGNED NOT NULL, PRIMARY KEY(n));
INSERT INTO seq (n) VALUES (1), (2), ...... , (99), (100);
Run Code Online (Sandbox Code Playgroud)
现在,我们将根据特定子字符串中子字符串的出现次数,JOIN在wph3_postmetaand seq表之间进行操作。我们可以使用以下方式获取子字符串的出现次数(这也意味着特定行中的牌数):'data-name=""'meta_value
(
CHAR_LENGTH(wp.meta_value)
- CHAR_LENGTH(REPLACE(wp.meta_value, 'data-name=""', ''))
) / CHAR_LENGTH('data-name=""')
Run Code Online (Sandbox Code Playgroud)
现在,我们可以使用该Substring_Index()功能提取卡中的值。使用不同行中的不同数字,我们基本上可以提取出第一张卡,第二张卡,等等。
一旦我们将所有单词提取出来,就放在单独的行中;然后,我们可以将完整的结果集用作“ 派生表”,并执行聚合查询以获取所需结果:
查询(在数据库小提琴上查看)
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 */
Run Code Online (Sandbox Code Playgroud)
结果
| 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 |
Run Code Online (Sandbox Code Playgroud)
注意:如果您只想按数量排名前10,则只需LIMIT 10在查询末尾添加即可。