Сортировка строк в PHP / MySQL, соответствующих определенным критериям - PullRequest
1 голос
/ 26 августа 2011

У меня есть таблица базы данных с 6 полями, которая содержит информацию о ресторанах:
ID
Имя
тип
category_1
category_2
категория_3

Существует три «типа» ресторанов: золотой, серебряный и бронзовый. Золотые рестораны представлены на всех 3 страницах их категорий (category_1, category_2 и category_3). Серебряные рестораны представлены в двух верхних категориях (категория_1 и категория_2). Бронзовые рестораны представлены только в первой категории (категория_1). На страницах моей категории мне нужно отобразить все рестораны в этих категориях, но укажите рестораны, которые соответствуют критериям (то есть, они должны быть указаны вверху). Я не уверен, как это сделать с PHP / MySQL. Я могу просто запросить рестораны в категориях, но как мне сказать, чтобы они выделяли лучшие рестораны? Вот что мне нужно сделать в категории «мексиканец»:

Показать все мексиканские рестораны. Продвигайте золотые рестораны, в которых "мексиканцы" перечислены в любом из полей своей категории, рекламируйте серебряные рестораны, в которых "мексиканцы" входят в две верхние поля категорий, и рекламируйте бронзовые рестораны, в которых "мексиканец" находится в поле высшей категории.

Я думал о многих разных способах сделать это и не могу понять это.

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Это проблема зачатия.Вы не должны иметь три столбца "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
0 голосов
/ 26 августа 2011

Добавьте это к вашему заказу:

ORDER BY FIELD(type,"gold","silver","bronze")
0 голосов
/ 26 августа 2011

Это должно помочь вам с существующей структурой таблицы.Я предполагаю, что 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;
...