对多列的mysql查询结果进行排序

时间:2011-08-13 03:44:32

标签: mysql database

我有一张桌子,列出了建筑物内允许的人员名单。允许每位居民提供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的新手 - 我错过了一些简单的东西吗?

另外,如果那更好的话,我愿意重组表/添加表。

3 个答案:

答案 0 :(得分:2)

您应该重组表格。创建一个名为access的新表格或包含accessIdresidentIdguest字段的内容。

  • accessId是主键,它是AUTO_INCREMENT INTEGER。
  • residentresidentlist表的外键。
  • 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。所以你有:

  • ResidentId
  • 名称
  • 地址....

然后您有一个guest表,指定有关guest虚拟机的信息:

  • GuestId
  • 名称
  • 别的...

然后你有第三个表实际上关联了guest和resident(guestToResidentTable)。这将有两个字段:

  • ResidentId
  • GuestId
  • 您可能还需要每个关系的唯一ID - 在此表中创建三个字段

    两个id字段都是其他表中的外键。

这样每个访客都会与每个住户相关,就像Derek所说,你在你的应用程序(而不是数据库)中强制执行10个访客限制。

然后,您可以在访客表中搜索所有访客,例如您的搜索查询。如果您想了解有关客人的信息以及与他有关的居民,您只需加入其他表格即可。