2009-11-02 3 views
3

Вот мой запрос SQL на MySQL (MySQL: 5.0.51a). Я хочу иметь список ресторана с его дешевым меню:Группа синтаксиса MySQL по ресторану с более дешевым меню

select r.id, rm.id, rm.price, moyenne as note, 
get_distance_metres('47.2412254', '6.0255656', map_lat, map_lon) AS distance 

from restaurant_restaurant r 
LEFT JOIN restaurant_menu rm ON r.id = rm.restaurant_id 

where r.isVisible = 1 

group by r.id 
having distance < 2000 
order by distance ASC 
limit 0, 10 

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

Thx для вашей помощи.

ответ

1

И что-то подобное, что не работает:

SELECT r.id as restaurant_id, rm.id as menu_id, rm.price as price, r.moyenne AS note, 
get_distance_metres('47.2412254', '6.0255656', map_lat, map_lon) AS distance 

FROM restaurant_restaurant r 
LEFT JOIN restaurant_menu rm ON r.id = rm.restaurant_id 

WHERE r.isVisible = 1 

GROUP BY r.id 
HAVING MIN(price) AND distance < 120000 
ORDER BY price ASC, distance ASC 
LIMIT 0, 10 
+0

Это решение дает мне минимальную цену, но у меня все еще есть неправильный menu.id –

+0

Я добавил MIN (цена) в предложение HAVING вместо предложения SELECT – Natim

+0

По-прежнему цена не является ценой menu_id ... – Natim

1

Да, если выбрать столбец, который не является функционально зависимым от предложения GROUP BY вы получите случайный (*) выбор в MySQL. Это не стандарт ANSI SQL, а другие базы данных выдадут вам ошибку.

Вы хотите, чтобы все рестораны имели меню с более дешевой ценой, чем определенный уровень? Если это так просто, просто добавьте

WHERE rm.price<1000 -- or whatever price 

статья.

Однако, если вы хотите сказать, что вы хотите перечислить рестораны с их самым дешевым меню, то вы после этого называетесь групповым минимумом и удивительно сложно сделать в SQL. Есть quite a few подходы к атаке; см. также this question. Вот один с внешнепризматическим себя нулем присоединиться:

SELECT 
    r.id, rm.id, rm.price, r.moyenne AS note, 
    get_distance_metres('47.2412254', '6.0255656', map_lat, map_lon) AS distance 
FROM restaurant_restaurant AS r 
JOIN restaurant_menu rm ON r.id=rm.restaurant_id 
LEFT JOIN restaurant_menu AS no_menu ON r.id=no_menu.restaurant_id AND no_menu.price<rm.price 
WHERE no_menu IS NULL 
AND r.isVisible=1 
AND distance<2000 
AND rm.price<1000 -- if you only want restaurants with a menu cheaper than certain price 
ORDER BY distance 
LIMIT 10; 

Обратите внимание, что, как и многие варианты максимально GROUPWISE это даст вам два результата для одного ресторана, если он имеет два же цены дешевого меню.

(*: на самом деле вы, как правило, получаете первую строку в порядке хранения MySQL, которая много времени будет первой, которую вы поместили в базу данных, которая немного ловушка, потому что иногда это то, что вы хотите так что, похоже, он работает, пока порядок не изменится по какой-то причине, и все пошло не так. Опасно!)