2009-12-08 5 views
1

У меня есть следующий запрос:SQL группы по количеству проблем

select d.restaurant_id, restaurant_category, dish_name, cuisine_id, count(ingredient_id) 
    from restaurant r, dish d, composition c 
where r.restaurant_id = d.restaurant_id 
    and d.restaurant_id = c.restaurant_id 
    and d.dish_id = c.dish_id 
group by d.restaurant_id 
having count(distinct cuisine_id) > 1; 

таблиц являются следующими:

  • ресторана (restaurant_id, restaurant_category)
  • блюда (restaurant_id, dish_name, dish_id, kitchen_id)
  • Состав (restaurant_id, dish_id, componentent_id)

Запрос, возвращающий только одну строку, когда он должен возвращаться 3. Любые идеи?

+2

Это домашнее задание? – richardtallent

+0

Это может быть только MySQL - только db Я знаю, чтобы разрешать «скрытые» значения в группе: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html –

+1

Можете ли вы добавить «EXPLAIN EXTENDED» перед запросом и вставить вывод в приглашении? –

ответ

-1

Вы не можете использовать подобную функцию в объединении. Вам нужно обернуть это в подзапросе или что-то в этом роде.

+1

Нет, отлично использовать агрегат в таблице JOIN'd. –

2

Предложение № 1, использование сочетаний стиля SQL92. Предложение №2, используйте псевдоним во всех ваших именах столбцов Предложение № 3, если вы хотите, чтобы отдельная кухня_ид затем сделала эту часть совокупности.

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

Вот что он должен выглядеть следующим образом:

SELECT 
    d.restaurant_id, 
    cuisine_id, 
    Count(ingredient_id) 
FROM restaurant r 
INNER JOIN dish d ON r.restaurant_id = d.restaurant_id 
INNER JOIN composition c ON d.restaurant_id = c.restaurant_id AND d.dish_id = c.dish_id 
GROUP BY d.restaurant_id, cuisine_id 
HAVING Count(distinct(cuisine_id)) > 1 

OR 

SELECT 
    d.restaurant_id, 
    restaurant_category, 
    dish_name, 
    cuisine_id, 
    Count(ingredient_id) 
FROM restaurant r 
INNER JOIN dish d ON r.restaurant_id = d.restaurant_id 
INNER JOIN composition c ON d.restaurant_id = c.restaurant_id AND d.dish_id = c.dish_id 
GROUP BY d.restaurant_id, restaurant_category, dish_name, cuisine_id, 
HAVING Count(distinct(cuisine_id)) > 1 

Если вам нужны все эти столбцы, то вам нужно будет сделать это в качестве суб-запроса.

0

Был ли этот SQL Server, я бы сказал, что у вас есть ошибка в предложении GROUP BY. Попытка:

SELECT d.restaurant_id, restaurant_category, dish_name, cuisine_id, COUNT(ingredient_id) 
FROM restaurant r, dish d, composition c 
WHERE r.restaurant_id = d.restaurant_id 
    AND d.restaurant_id = c.restaurant_id 
    AND d.dish_id = c.dish_id 
GROUP BY d.restaurant_id, restaurant_category, dish_name, cuisine_id 
HAVING COUNT(DISTINCT cuisine_id) > 1; 
Смежные вопросы