SELECT DISTINCT
"F1"."food",
"F1"."country"
FROM "foo" "F1"
WHERE
"F1"."food" =
(SELECT "food" FROM
(
SELECT "food", COUNT(*) AS "count"
FROM "foo" "F2"
WHERE "F2"."country" = "F1"."country"
GROUP BY "F2"."food"
ORDER BY "count" DESC
) AS "F5"
LIMIT 1
)
ну, я записал это второпях и не проверял его действительно хорошо. Подвыбор мог бы быть довольно медленным, но это - самый короткий и самый простой SQL-оператор, о котором я мог думать. Я, вероятно, скажу больше, когда я буду меньше пьяный.
пз: О, хорошо "нечто" является названием моей таблицы, "еда" содержит название еды и "страны" название страны. Демонстрационный вывод:
food | country
-----------+------------
Bratwurst | Germany
Fisch | Frankreich
попробуйте это:
Select Country, Food_id
From Munch T1
Where Food_id=
(Select Food_id
from Munch T2
where T1.Country= T2.Country
group by Food_id
order by count(Food_id) desc
limit 1)
group by Country, Food_id
Вот то, как сделать это без любых временных таблиц:
Редактирование: упрощенный
select nf.country, nf.food_id as most_frequent_food_id
from national_foods nf
group by country, food_id
having
(country,count(*)) in (
select country, max(cnt)
from
(
select country, food_id, count(*) as cnt
from national_foods nf1
group by country, food_id
)
group by country
having country = nf.country
)
SELECT country, MAX( food_id )
FROM( SELECT m1.country, m1.food_id
FROM munch m1
INNER JOIN ( SELECT country
, food_id
, COUNT(*) as food_counts
FROM munch m2
GROUP BY country, food_id ) as m3
ON m1.country = m3.country
GROUP BY m1.country, m1.food_id
HAVING COUNT(*) / COUNT(DISTINCT m3.food_id) = MAX(food_counts) ) AS max_foods
GROUP BY country
мне не нравится, когда МАКС.(.) GROUP BY повреждает связи... Существует, должен быть способ включить съеденную дату в СОЕДИНЕНИЕ в некотором роде для произвольного выбора нового...
мне интересно на плане запросов для этой вещи, если Вы выполняете его на своих живых данных!
select country,food_id, count(*) ne
from food f1
group by country,food_id
having count(*) = (select max(count(*))
from food f2
where country = f1.country
group by food_id)
Попробуйте что-то вроде этого
select country, food_id, count(*) cnt
into #tempTbl
from mytable
group by country, food_id
select country, food_id
from #tempTbl as x
where cnt =
(select max(cnt)
from mytable
where country=x.country
and food_id=x.food_id)
, Это могло быть помещено все в единственный выбор, но у меня нет времени для слоняний без дела с ним прямо сейчас.
Удача.