我的数据库有一个包含3个字段的表格消息:'messageid',messagetext (varchar)
,dateposted (datetime)
我想在字段messagetext
中存储一堆邮件,以及在字段dateposted
中发布的各自日期。很多这些消息都会包含hashtags
。
然后,使用PHP和MySQL,我想找出哪些主题标签是过去一周发布的消息中最常提到的前5个hashtags
。
我该怎么做?我真的很感激任何帮助。非常感谢提前。
答案 0 :(得分:0)
不要误解我,但你已经为一个受伤的世界做好了准备。最好的方法是遵循lonesomeday的建议并在插入时解析主题标签。这也大大减少了处理时间,并使其更具确定性(工作量在插入之间传播"
如果你想继续,你需要解决几个问题。
1)识别标签。
2)多选标签。如果你有一条消息说" #MySQL拆分是#cool",你想从那条消息得到两个行,一个说“MySQL'”,另一个很酷的'。
3)选择适当的消息
4)表演
您可以通过至少两种方式解决此问题。你可以使用存储函数,你找到here on SO(实际来自this site) - 你必须修改它。
此语法将为您提供value
中第一次出现#hashtag及其后的所有文字:
select substring(value, LENGTH(substring_index(value, '#', 1))+1);
然后,您需要确定每个#hashtag的位置#stops。 (它可能是#parenthesized)。此时你需要一个正则表达式,或者搜索至少一个字母数字字符的序列 - 用正则表达式的说法,[a-zA-Z0-9]+
- 通过指定所有可能的字符或使用循环,即"#&## 34;没关系," #t"没问题,"#ta"没关系," #tag"没关系," #tag,"不是,所以你的标签是' #tag' (或'标记')。
另一种更有前景的方法是使用用户定义函数来捕获主题标签;你可以使用PREG_CAPTURE
。
您可能必须合并两种方法:修改存储的函数的设置和内部循环以读取
DECLARE cur1 CURSOR FOR SELECT messages.messagetext
FROM messages
WHERE messages.messagetext LIKE '%#%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DROP TEMPORARY TABLE IF EXISTS table2;
CREATE TEMPORARY TABLE table2( hashtag` VARCHAR(255) NOT NULL
)ENGINE = Memory;
...
SET occurrence = (SELECT LENGTH(msgtext)
- LENGTH(REPLACE(msgtext, '#, ''))
+1);
SET i=1;
WHILE i <= occurrence DO
INSERT INTO table2 VALUES SELECT PREG_CAPTURE('/#([a-z0-9]+)/i', messagetext, occurrence));
SET i = i + 1;
END WHILE;
...
这将返回message-id和hashtags列表。然后,您需要GROUP
他们BY
#标签,按计数ORDER
计算他们和DESC
,最后添加LIMIT 5
以获得最受欢迎的五个。