Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-like-regexp的替代方案?_Mysql_Regex - Fatal编程技术网

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%'