Php 在mysql中搜索行

Php 在mysql中搜索行,php,mysql,Php,Mysql,我只是在学习设置可搜索的表格,对于任何迟钝的问题,我深表歉意。我已经设置了一个表,可以让我将消息发布到,似乎工作正常。我需要能够搜索表中的特定列,以确定消息是否应该显示在特定用户的提要中。这是我的节目创作 CREATE TABLE `feed` ( `messageid` int(11) unsigned NOT NULL AUTO_INCREMENT, `userid` text, `contactid` text, `subject` text, `message` te

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

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)
有人能帮我找出哪里出了问题吗?

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

若要将列(又名字段)与值进行匹配,通常会使用运算符告诉mysql,要将哪个字段与值进行匹配,以及如何匹配

在您的示例中,应使用equals运算符,如下所示:

mysql> select * from feed where contactid=2
存在很多操作符,它们会告诉mysql进行不同的查找(例如,在您的示例中,
大于操作符会告诉mysql获取contactid大于2的所有记录)

编辑:MySQL不提供字符串拆分功能,因为通常需要将这些数据拆分到多个表中并使用关系。通过“非黑客”方法,您最好使用FIND_IN_SET,但这需要将您的ContactID存储为CSV

试试这个:

mysql > select * from feed WHERE TRIM(contactid) = '2' OR contactid LIKE '% 2 %' OR contactid LIKE '2 %' OR contactid LIKE '% 2';

看起来,
userid
代表消息创建者,
contactid
的集合代表能够看到消息的用户集

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

下面是一个例子:

从消息中选择消息。*
messages.messageid=message\u contacts.messageid上的内部加入消息\u联系人
其中message_contacts.contactid=63

以这种方式存储数据也可以帮助您避免其他问题。您可以在我最喜欢的答案之一中了解更多信息:

您使用文本字段存储数字用户ID的原因是什么?通常,会使用数字字段类型。这允许您使用常规索引,而不是全文索引。使用文本字段存储所有数字数据绝对没有好处,而且有几个缺点。我建议你重新考虑你的模式。你的解决方案不能解决这个问题。Contactid包含4个联系人(63、66、65和63)。执行contactid=63将有效,因为它与第一个值匹配,但contactid=66将无效。所以,我想我的问题是;是否有运营商说contactid“包含”?从db设计的角度来看,您设置表和关系的方式是完全错误的,因此很难根据您所拥有的找出最佳解决方案。但是为了给你一个答案,请看我的编辑。它应该涵盖身份证的所有可能位置我想李,谢谢!我同意你的两个意见,表格可以安排得更好,但你建议的解决方案中的陈述也可以!谢谢你,李。
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     |
+-----------+-----------+