2013-06-08 2 views
0

Хорошо, для этого вопроса мне нужна идея, как сделать алгоритм для сортировки результатов.mysql добавить весовые параметры запроса

Позвольте мне объяснить проблему:

я иметь различные рецепты блюдо (более 2000), состоит из различных ингредиентов.

, имеющие 3 таблицы:

dish 
id | name 

ingredient 
id | name 

dish_ingredient 
id | id_dish | id_ingredient 

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

Пример, который работает сейчас: если пользователь выбирает ингредиенты говядины, моркови, лука, соли, перечного алгоритма, какие рецепты содержат эти ингредиенты (не обязательно все) и сортировать их по ингредиентам, которые есть у пользователя. Поэтому первый рецепт этой сортировки может иметь только соль, а затем, возможно, муку и яйца (рецепт блинов) в конце списка могут быть рецепты с говядиной, которые более удобны для пользователя.

Итак, моя идея состоит в том, что пользователь мог бы добавить несколько весов для своих ингредиентов, чтобы алгоритм поиска дал ему более правильные рецепты. Если вы не понимаете, чего я хочу, вы можете увидеть приложение на www.mizicapogrnise.si (транслировать его со словенского языка на ваш язык), чтобы увидеть, как приложение работает сейчас.

Благодарим за помощь.

ответ

3

Основной запрос для подсчета ингредиентов:

select di.id_dish, count(*) as NumIngredients 
from dish_ingredient di join 
    ingredient i 
    on i.id = di.id_ingredient 
group by di.id_dish; 

Вы можете изменить это для ингредиентов путем введения пункт case в запросе:

select di.id_dish, count(*) as NumIngredients, 
     sum(case when i.name = 'beef' then 2.0 
       when i.name = 'salt' then 0.5 
       . . . 
      end) as SumWeights 
from dish_ingredient di join 
    ingredient i 
    on i.id = di.id_ingredient 
group by di.id_dish 
order by SumWeights desc; 

. . . не является частью SQL синтаксис. Вы должны заполнить аналогичные строки, где это происходит.

Альтернативная формулировка заключается в размещении информации в подзапросе. Подзапрос содержит вес для каждого ингредиента. Затем он соединяется с таблицей dish_ingredient, чтобы получить вес для каждого ингредиента в каждом блюде. Внешний запрос агрегирует результаты по блюду:

select di.id_dish, count(*) as NumIngredients, 
     sum(w.weight) as SumWeights 
from dish_ingredient di join 
    ingredient i 
    on i.id = di.id_ingredient left outer join 
    (select 'beef' as name, 2.0 as weight union all 
     select 'salt', 0.5 union all 
     . . . 
    ) w 
    on i.name = w.name 
group by di.id_dish 
order by SumWeights desc; 

Оба эти метода требуют изменения запроса для получения необходимой массы информации в базу данных о.

+0

Как разрешить пользователям выбирать вес в приложении, чтобы они поняли ... и пусть говорят, что пользователь может выбрать более 10 ингредиентов из списка ... – Gasper

+0

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего MySQL-сервера, для правильного синтаксиса для использования рядом с) w на i.ingredientName = w.name group по запросу di.ID_dish SumWeights 'по строке 8 – Gasper

+0

. Я получаю сообщение об ошибке в третьем запросе и да i skip "..." =) – Gasper

Смежные вопросы