2011-08-26 20 views
1

我有6个领域一个数据库表,它包含有关餐馆的信息:
ID


category_1
category_2
category_3在PHP/MySQL的行排序符合某些标准的

有是三种“类型”餐厅:金,银和铜。在他们的所有三个分类页面(category_1,category_2和category_3)中都有金牌餐厅。银色餐厅的特色是其最上面两类(category_1和category_2)。青铜餐厅仅限于第一类(category_1)。在我的分类页面上,我需要显示这些分类中的所有餐馆,但要列出符合要求的餐馆(即,他们需要列在最上面)。我不知道如何用PHP/MySQL来做到这一点。我可以查询类别中的餐馆,但我怎么告诉它把特色餐厅放在顶部?这是我需要做的类别“墨西哥”:

显示所有墨西哥餐馆。推广在其任何分类领域中列有“墨西哥”的金牌餐厅,推广在前两类产品中含有“墨西哥”的银色餐厅,并在其顶级分类领域推广拥有“墨西哥”的青铜餐厅。

我一直在想很多不同的方式来做到这一点,无法弄清楚。

+1

我不能凭良心直接解决您的问题,因为你的表结构是完全错误的。 每当你有像'category_1','category_2'等列,这表明该类别是一个重复组,并不属于该表。 正确的解决方案是通过将重复组“归一化”为单独的表来修复您的结构。 你应该有一个“类别”表,每个类别有1行。然后,你需要一个餐厅和类别之间的表来解决多对多的关系。 – gview

+0

通常人们会将这张表命名为restaurantcategory。 restaurantcategory将在其中有类别和餐厅的外键,并且如果以某种任意方式保留1st,2nd 3rd的想法很重要,可能还需要一个“roworder”列。 – gview

+0

您可以从正确的结构中获益: - 类别查询不需要查看所有3个类别列 - 您可以随时添加第4或第5类而不会中断您的应用程序 - 如果类别是字符串,存储一个数字键而不是几个大的字符串,你大大减少了表的大小 - 通常db提供“参照完整性”约束,这将确保例如,你不能输入一个餐厅的类别存在于类别表 - 并且......这只是关系数据库意图被设计的方式。 – gview

回答

0

这应该可以帮助您解决您现有的表格结构。
我假设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; 
+0

哇感谢您的快速响应,我一直在寻找几个小时的方式来“说出”我一直在尝试做的事情,谢谢你,谢谢你,谢谢你! – tim

0

这种通过添加到您的订单:

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

这是一个观念的问题。你不应该有三个“category_X”列。相反,你应该有一个单独的表(例如restaurant_category)。基本上,你的表结构是这样的:

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

你可以(也应该)甚至通过创建一个类别表和类型表正常化你的表,但对这一问题的缘故,我只是假设你赢了“T。然后,你在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 
+0

接近我建议的内容,但我会走额外的距离,并有空间相关的性能原因的类别表,并避免错别字的担忧。 – gview

+0

gview - 看到我上面的评论,但感谢您的意见 – tim