我有一个包含6个字段的数据库表,其中包含有关餐馆的信息:
ID
命名
键入
category_1
category_2
category_3
餐厅有三种“类型”:金,银和铜。所有3个类别页面(category_1,category_2和category_3)都有金牌餐厅。银牌餐厅位于前两个类别(category_1和category_2)。青铜餐厅仅限于他们的第一类(category_1)。在我的类别页面上,我需要显示这些类别中的所有餐馆,但要限制有资格成为特色的餐馆(即,他们需要在顶部列出)。我不知道如何用PHP / MySQL做到这一点。我可以查询类别中的餐馆就好了,但是如何告诉它将特色餐厅放在最顶层?这就是我需要对“墨西哥”类别进行的操作:
显示所有墨西哥餐馆。促进在其任何类别领域中列出“墨西哥”的黄金餐厅,推广在其前两个类别领域中具有“墨西哥”的银色餐厅,并推广在其顶级类别领域中具有“墨西哥”的青铜餐厅。
我一直在考虑许多不同的方法来解决这个问题。
答案 0 :(得分:1)
这是一个概念问题。你不应该有三个“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
答案 1 :(得分:0)
这可以帮助您使用现有的表结构。
我假设type
在此查询中包含bronze
,silver
和gold
。
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;
答案 2 :(得分:0)
通过以下方式将此添加到您的订单中:
ORDER BY FIELD(type,"gold","silver","bronze")