Синтаксическая группа MySQL по ресторанам с более дешевым меню - PullRequest
3 голосов
/ 02 ноября 2009

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

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

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

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

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

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

WHERE rm.price<1000   -- or whatever price

пункт.

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

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;

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

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

1 голос
/ 02 ноября 2009

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...