我有一张桌子,列出了建筑物内允许的人员名单。允许每位居民提供10个非居民访问权。
resident guest1 guest2 ... guest10
我想搜索所有来宾,然后按字母顺序显示结果。目前我有:
$result = mysql_query("SELECT * FROM residentlist WHERE guest1 LIKE 'searchquery' OR guest2 LIKE 'searchquery' ... OR guest10 LIKE 'searchquery'";
但我最终得到了与'searchquery'
不同的额外客人,因此我需要进行更多if
次检查。
我是mysql的新手 - 我错过了一些简单的东西吗?
另外,如果那更好的话,我愿意重组表/添加表。
答案 0 :(得分:2)
您应该重组表格。创建一个名为access
的新表格或包含accessId
,residentId
和guest
字段的内容。
accessId
是主键,它是AUTO_INCREMENT INTEGER。resident
是residentlist
表的外键。guest
是您现在使用LIKE条件搜索的内容。因此,对于每位居民的10位客人,您将在access
表中拥有10条记录。
完成后,您可以使用查询:
SELECT * FROM residentlist LEFT JOIN access ON access.residentId = residentlist.resident WHERE guest LIKE '<search query>';
答案 1 :(得分:2)
如果一个居民与您的搜索查询匹配,您当前的select语句将返回所有来宾。因此,如果Bob允许Jack和Jane并且你搜索Jane,那么它将返回整个Jack和Jane。
是的,这应该重新设计为一个单独的表,只是Resident,Guest。应该在应用程序端而不是数据库上强制执行10个最大值。请参阅Shi的答案,以获得有关如何构建前进的优秀解释。
如果您需要保留当前结构,可以通过UNION
运算符获得所需的结果。
SELECT guest1 FROM residentlist WHERE guest1 LIKE 'searchquery'
UNION SELECT guest2 FROM residentlist WHERE guest2 LIKE 'searchquery'
...
UNION SELECT guest10 FROM residentlist WHERE guest10 LIKE 'searchquery'
答案 2 :(得分:0)
我觉得数据库可以更好地组织起来。作为一般规则,如果你有一个字段名称是blah1,blah2,... blahX,那通常是一个红旗。
无论如何,听起来你有两个对象:客人和居民,然后是他们之间的关系。
因此,您可以拥有一个驻留表,其中包含有关驻留者的信息以及驻留的唯一标识符,例如residentId。所以你有:
然后您有一个guest表,指定有关guest虚拟机的信息:
然后你有第三个表实际上关联了guest和resident(guestToResidentTable)。这将有两个字段:
您可能还需要每个关系的唯一ID - 在此表中创建三个字段
两个id字段都是其他表中的外键。
这样每个访客都会与每个住户相关,就像Derek所说,你在你的应用程序(而不是数据库)中强制执行10个访客限制。
然后,您可以在访客表中搜索所有访客,例如您的搜索查询。如果您想了解有关客人的信息以及与他有关的居民,您只需加入其他表格即可。