В книге "Mastering Perl" есть глава "Философия борьбы с неразрешимыми проблемами от Брайена ди Фоя". Один из рецептов звучит так: "А пытались ли вы поговорить об этом с Мишкой?"
На одной из работ,-- рассказывает автор,-- у меня был коллега, к которому я всегда обращался за советом как только что-то не получалось. Большинство таких консультаций заканчивалось одинаково: уже после третьего предложения я понимал, в чем дело, и обрывал свой монолог. Теперь,-- продолжает Брайен де Фой -- у меня возле компьютера живет плюшевый Мишка, с которым я вслух обсуждаю рабочие проблемы, дабы не беспокоить коллег.
Я вспомнил этот совет когда ломал голову над тестовым заданием следующего содержания:
Есть две таблицы:У меня сложные отношения с SQL. Периодически в него погружаюсь и решаю довольно сложные задачи. Но стоит полгода не позаниматься -- все забывается чуть ли не начисто. (Нечто подобное, но еще в большей степени происходит с XSLT). Ясно было, что надо использовать GROUP и MAX, но как объединить все это в один запрос?...
table1 (table1_id integer, name varchar(255)),
table2 (table2_id integer, table1_id integer, alias varchar(255))
Выбрать записи из table1, для которых количество подчинённых записей в table2 максимально.
Я прокрался в спальню, к детской кроватке. У пятилетнего Степы есть несколько медведей, в том числе два белых брата Кнут и Олаф Хаммундсены. Интуиция подсказывала, что для моих целей подойдет Винни-Пух. Через пять минут я четко и с расстановкой объяснял ему, в чем проблема. А через 10 минут решение было готово. Вот оно:
SELECT table1_id FROM table2
GROUP BY table1_id
HAVING COUNT(*) =
(
SELECT MAX(table2_count)
FROM (
SELECT COUNT(*) AS table2_count
FROM table2
GROUP BY table1_id
) AS inner_table
);
GROUP BY table1_id
HAVING COUNT(*) =
(
SELECT MAX(table2_count)
FROM (
SELECT COUNT(*) AS table2_count
FROM table2
GROUP BY table1_id
) AS inner_table
);
- Узнать, сколько дочерних записей приходится на каждую родительскую запись.
- Найти максимум.
- Выбрать строки, где количество дочерних записей равно найденному максимуму.