2009-12-02 150 views
0

我有一个表的设置方式如下搜索MySQL的领域

`id` int(11) NOT NULL AUTO_INCREMENT, 
    `eventid` int(11) NOT NULL, 
    `invites` text COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 

在该表中我有一个看起来像这样

1, 127, '32215, 55648, 89887, 55555, 66666, 33333' 
2, 168, '44444, 33333, 121212, 0540541' 

我将如何搜索invites场contnts行的内容对于特定数字的匹配,例如如果我想搜索33333,它将返回两行,但如果我搜索了44444,它将只返回第二行?

回答

3

我相信你可以使用find_in_set(),所以像:

select * from tablename where find_in_set('44444', invites); 

这不是很好的数据库设计虽然。

+0

缺点是什么,什么是更好的解决方案?考虑到我在邀请字段 – mrpatg 2009-12-02 04:47:41

+0

中每行最多可能有1000个差异数字,但缺点是如果find_in_set()必须通过寻找id的文本字段进行解析,那么find_in_set()会很慢,但更好的解决方案是每个eventid有多行,并使邀请为一个int,每行都是您当前邀请字段的值之一。然后为eventid和invites添加索引(或者如果你重命名它,我会假设它们是ids),那么在表格上简单选择一个特定的inviteid将会更快地返回正确的eventids。 – catfarm 2009-12-02 05:03:48

0

作为一个便笺,请允许我注意,您的数据库模式 - 将一组值存储在纯文本字段中 - 是不合适的。如果你想在这样一个一对多的关系查询,你应该有一个定义一个事件和一个邀请的关系,这样的另一个表:

eventid invitationid 
1 15 
1 16 
1 17 
2 18 
3 19 
3 20 

然后你会能够做标准的SQL查询,这些查询实际上是高性能的,并且是有意义的。