0

我只是在学习设置可搜索的表格,对于任何迟钝的问题,我提前道歉。我已经设置了一个表格,可以让我向其发布消息,似乎工作正常。我需要能够搜索表中的特定列,以确定消息是否应该显示在特定用户的提要中。这是我的节目创作;

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。如果出现,该消息将显示在用户的提要中。但是,当我进行搜索时,什么也没有出现;

mysql> select * from feed where match(contactid) against(63);
Empty set (0.00 sec)

有人可以帮我弄清楚我哪里出错了吗?

4

2 回答 2

1

MATCH() AGAINST()用于所谓的“全文搜索”,谷歌搜索更多信息,那里已经有足够的信息了。

如果您将列(又名字段)与值匹配,您通常会使用运算符告诉 mysql,与您的值匹配的字段以及如何匹配它。

在您的示例中,您应该像这样使用等于运算符:

mysql> select * from feed where contactid=2

存在许多运算符,它们会告诉 mysql 进行不同的查找(即>大于运算符,会告诉 mysql 获取所有联系人 ID 大于 2 的记录,在您的示例中)。

编辑:MySQL 不提供字符串拆分功能,因为通常希望您将此数据拆分到多个表并使用关系。通过“非 hacky”方法获得的最好方法是使用 FIND_IN_SET,但这需要将您的联系人 ID 存储为 CSV。

尝试这个:

mysql > select * from feed WHERE TRIM(contactid) = '2' OR contactid LIKE '% 2 %' OR contactid LIKE '2 %' OR contactid LIKE '% 2';
于 2013-09-09T19:16:37.000 回答
1

它看起来userid代表消息创建者,而contactid's 的集合代表将能够看到消息的用户集合。

我建议feed分成两个表,一个包含消息,另一个具有多对多关系messageidtocontactid而不是包含包含contactids 列表的列。通过这种方式,您将能够连接这两个表以创建一个查询,以使用简单=而不是全文搜索来检索特定用户可查看的消息。

这是一个例子:

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

以这种方式存储数据也可以帮助您避免其他问题。您可以在我最喜欢的答案之一中阅读更多相关信息:在数据库列中存储分隔列表真的那么糟糕吗?

于 2013-09-09T19:33:57.000 回答