MySQL-like-regexp的替代方案?
我的数据库表中有超过一百万条记录。 当我使用时,喜欢非常慢,当我使用与比赛时,他们丢失了一些记录 我创建帮助表: 标签列表MySQL-like-regexp的替代方案?,mysql,regex,Mysql,Regex,我的数据库表中有超过一百万条记录。 当我使用时,喜欢非常慢,当我使用与比赛时,他们丢失了一些记录 我创建帮助表: 标签列表 tag_id tag_name 标记相关信息 tag_id messag_id 消息 message_id message_text 在标记列表中,我添加$message\u text的所有单词-explode(“,$message\u text”) 我的新问题是: SELECT m.* FROM tag_rel_messages trm INNER JOIN m
tag_id
tag_name
标记相关信息
tag_id
messag_id
消息
message_id
message_text
在标记列表中,我添加$message\u text的所有单词-explode(“,$message\u text”)
我的新问题是:
SELECT m.*
FROM tag_rel_messages trm
INNER JOIN messages m ON (trm.message_id = m.message_id)
INNER JOIN tag_list tl ON (trm.tag_id=tl.tag_id
WHERE tl.tag_name REGEXP 'pionas' AND tl.tag_name REGEXP 'website'
GROUP By trm.message_id
但不显示任何记录
这个查询有什么问题?
也许我应该用REGEXP以外的东西
谢谢你的帮助我不确定一个栏目怎么能同时匹配两件事!您可以使用
或
代替和
,也可以使用对的单个调用
您需要两次加入
tag_列表
和tag_rel_消息
表,以匹配两个不同的标记
SELECT m.*
FROM messages AS m
JOIN tag_rel_messages AS trm1 ON m.message_id = trm1.message_id
JOIN tag_list AS t1 ON t1.tag_id = trm1.tag_id
JOIN tag_rel_messages AS trm2 ON m.message_id = trm2.message_id
JOIN tag_list AS t2 on t2.tag_id = trm2.tag_id
WHERE t1.tag_name = 'pionas' AND t2.tag_name = 'website'
另一种方法是使用任意一个标记进行连接,并计算每条消息的结果数
SELECT m.*
FROM messages AS m
JOIN tag_rel_messages AS trm ON m.message_id = trm.message_id
JOIN tag_list AS t ON t1.tag_id = trm.tag_id
WHERE t.tag_name IN ('pionas', 'website')
GROUP BY m.message_id
HAVING COUNT(*) = 2
第二种形式更容易推广到任意数量的标记。将所有标记放在in
子句中,并更改HAVING
子句以匹配标记的数量
$words = array('pionas', 'website');
$tags_id = array();
foreach ($words as $key => $val) {
$sql = "SELECT tag_id FROM tag_list WHERE tag_name LIKE '%".$val."%'";
$records = $db->query($sql);
$tags_id[$key] = array_column($records, "tag_id");
}
$inner_array = array();
foreach ($tags_id as $k => $v) {
$short_name = "trm_".$k;
$inner_array[] = " INNER JOIN tag_rel_message as ".$short_name." ON ( ".$short_name.".message_id = m.message_id AND ".$short_name.".tag_id IN (".implode(", ", $v).")) ";
}
$sql = "SELECT DISTINCT m.* FROM messages m".implode(" ", $inner_array);
我认为这是一样的:
SELECT * FROM messages WHERE message_text like '%pionas%' AND message_text like '%website%'
如果我理解正确,tag_列表的
tag_name
仅包含单个标记关键字,那么任何单个标记如何能够同时匹配pionas
和网站
?是的,仅包含单个关键字。你说得对。那么我应该怎么做才能在所有条件都为真的情况下找到这条消息呢?您的where
子句声明tag\u name
需要同时匹配'pionas'
和'website'
。可能尝试或而不是和?为什么像和REGEXP
?为什么不tag\u name='pionas'
?我使用REGEXP,因为tag\u name可能是网站、网站等。
SELECT * FROM messages WHERE message_text like '%pionas%' AND message_text like '%website%'