MySQL - 替代类似 - regexp?

时间:2015-12-21 19:47:44

标签: mysql regex

我的数据库表中有超过一百万的记录。 当我使用喜欢非常慢时,当我使用匹配时,他们会丢失一些记录。

我创建了帮助表:

tag_list

tag_id
tag_name

tag_rel_message

tag_id
messag_id

讯息

message_id
message_text

在tag_list中我添加$ message_text的所有单词 - explode("",$ message_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以外的东西?

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

我不确定一列可以同时匹配两件事!您可以使用OR代替AND,或者只需拨打REGEXP一次。

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|website' 
GROUP By trm.message_id

答案 1 :(得分:0)

您需要两次加入tag_listtag_rel_message表格才能匹配两个不同的代码。

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子句以匹配标记数。

答案 2 :(得分:0)

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