我正在学习设置可搜索的表格,我提前为任何迟钝的问题道歉。我已经设置了一个表格,允许我发布消息,似乎工作正常。我需要能够搜索表中的特定列,以确定消息是否应该显示在特定用户的提要中。这是我的节目创作;
CREATE TABLE `feed` (
`messageid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userid` text,
`contactid` text,
`subject` text,
`message` text,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`flag` int(2) NOT NULL,
`state` int(2) NOT NULL,
`trash` int(2) NOT NULL,
PRIMARY KEY (`messageid`),
FULLTEXT KEY `contactid` (`contactid`),
FULLTEXT KEY `userid` (`userid`),
FULLTEXT KEY `message` (`message`),
FULLTEXT KEY `subject` (`subject`)
) ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=latin1
我相信表格类型设置正确(MyISAM),并且我想要搜索的任何字段都已正确设置为文本。这是表格的全部内容;
+-----------+--------+-----------+-----------------------------------------+--------------------------------------------+
| messageid | userid | contactid | subject | message |
+-----------+--------+-----------+-----------------------------------------+--------------------------------------------+
| 40 | 67 | 63 66 65 | Another test with apostraphes '''''' | ''' '''' ,,,, ''' ,,,' '''' test test test |
| 39 | 67 | 63 | Here's a test (with apostraphes '''''') | '''''' test test test ''''' |
+-----------+--------+-----------+-----------------------------------------+--------------------------------------------+
所以,我的想法是在contactid列中搜索用户的用户ID。如果显示,则消息将显示在用户的Feed中。但是,当我进行搜索时,没有任何显示;
mysql> select * from feed where match(contactid) against(63);
Empty set (0.00 sec)
有人可以帮我弄清楚我哪里出错吗?
答案 0 :(得分:1)
MATCH() AGAINST()
用于所谓的“全文搜索”,谷歌搜索更多信息,已经有足够的信息。
如果您将列(又名字段)与值匹配,通常会使用运算符来告诉mysql,哪个字段与您的值匹配,以及如何匹配它。
在您的示例中,您应该像这样使用equals运算符:
mysql> select * from feed where contactid=2
存在很多运算符,它们会告诉mysql执行不同的查找(即>
大于运算符,会告诉mysql获取contactid大于2的所有记录,在您的示例中)。
编辑:MySQL不提供字符串拆分功能,因为通常需要将这些数据拆分为多个表并使用关系。通过“非hacky”方法获得的最佳方法是使用FIND_IN_SET,但这需要将contactids存储为CSV。
试试这个:
mysql > select * from feed WHERE TRIM(contactid) = '2' OR contactid LIKE '% 2 %' OR contactid LIKE '2 %' OR contactid LIKE '% 2';
答案 1 :(得分:1)
userid
代表邮件创建者,contactid
的集合代表了能够看到邮件的用户集。
我建议将feed
拆分为两个表,一个包含消息,另一个包含messageid
到contactid
的多对多关系,而不是包含包含列表的列contactid
秒。这样,您就可以加入这两个表来创建查询,以使用简单的=
而不是全文搜索来检索特定用户可查看的消息。
这是一个例子:
messages
+-----------+--------+------------------+----------------+
| messageid | userid | subject | message |
+-----------+--------+------------------+----------------+
| 40 | 67 | Another test | test test test |
| 39 | 67 | Here's a test | test test test |
+-----------+--------+------------------+----------------+
message_contacts
+-----------+-----------+
| messageid | contactid |
+-----------+-----------+
| 40 | 63 |
| 40 | 66 |
| 40 | 65 |
| 39 | 63 |
+-----------+-----------+
SELECT messages.* FROM messages
INNER JOIN message_contacts ON messages.messageid = message_contacts.messageid
WHERE message_contacts.contactid = 63
以这种方式存储数据可以帮助您避免其他问题。您可以在我最喜欢的答案中阅读更多相关信息:Is storing a delimited list in a database column really that bad?