在PHP/MySQL中对匹配特定条件的行进行排序


Sorting rows in PHP/MySQL that match certain criteria

我有一个包含6个字段的数据库表,其中包含有关餐馆的信息:
id
名称
类型
category_1
category_2
category_3

有三种"类型"的餐馆:金色,银色和青铜色。金牌餐厅在他们的3个分类页面(分类1,分类2和分类3)上都有特色。银奖餐厅在他们的前两类(第一类和第二类)中有特色。青铜色餐厅仅在第一类(category_1)中有特色。在我的分类页面,我需要在这些类别中显示所有的餐馆,但特色餐厅谁有资格被特色(即,他们需要在顶部列出)。我不知道如何做到这一点与PHP/MySQL。我可以在分类中查询餐馆,但我怎么让它把特色餐馆放在最前面呢?下面是我需要对类别"Mexican"所做的操作:

显示所有墨西哥餐厅。推荐在任何类别字段中都有"墨西哥"字样的金奖餐厅,推荐在前两个类别字段中有"墨西哥"字样的银奖餐厅,以及推荐在其顶级类别字段中有"墨西哥"字样的铜奖餐厅。

我一直在想很多不同的方法来做到这一点,但还是没有找到。

这是一个概念问题。您不应该有三个"category_X"列。相反,您应该有一个单独的表(例如restaurant_category)。基本上,您的表结构看起来像这样:

restaurant (restaurant_id, name, type)
restaurant_category (restaurant_id, category_name)

您甚至可以(并且应该)通过创建类别表和类型表来规范化您的表,但是为了这个问题,我假设您不会这样做。然后,在restaurant_category中为铜牌餐厅添加一行,为银牌餐厅添加两行,为金牌餐厅添加三行,然后可以使用如下查询:

    SELECT name
      FROM restaurant
INNER JOIN restaurant_category
     USING (restaurant_id)
     WHERE category_name = 'Mexican'
  ORDER BY FIELD(type, 'Gold', 'Silver', 'Bronze'); -- if you had normalized
                                                    -- you'd use a column like
                                                    -- type_order to order by

这将有助于您处理现有的表结构。
在此查询中,我假设type包含bronze, silvergold

SELECT * FROM restaurants 
WHERE category_1 = 'Mexican' 
  OR (category_2 = 'Mexican' AND type in ('silver','gold'))
  OR (category_3 = 'Mexican' AND type = 'gold')
ORDER BY Field(type,'gold','silver','bronze'), name asc;

添加到您的订单:

ORDER BY FIELD(type,"gold","silver","bronze")