Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> результат MAX() после COUNT(), получение MAX() из вложенного запроса 
V
    Опции темы
KIRINDORF
Дата 11.3.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Первая таблица SONG имеет поля: id - идентификатор записи, Song - собственно песня, nominac - номинация песни(например, рок, поп, ретро...). Производится процедура голосования за песни. Голоса заносятся в таблицу TOP, у которой поля: song_id - идентификатор песни из таблицы SONG, Song - песня, nominac - номинация песни. Все. Теперь нужно определить песню-победителя по итогам голосования. Делаю такой запрос:
Код

SELECT Song,song_id,COUNT(song_id) FROM TOP WHERE nominacia='".$Nominac[$i]."' GROUP BY Song

и затем в коде PHP из результата этого запроса определяю победителя, т.е. песню с наибольшим рейтингом, которая чаще всех встретилась в таблице TOP. А нельзя ли и эту задачу поручить MySQL? Пытаюсь нацарапать следующее:
Код

SELECT song_id FROM TOP WHERE MAX(song_id) IN (SELECT song_id,COUNT(song_id) FROM TOP WHERE nominacia='".$Nominac[$i]."' GROUP BY Song)
 smile 
получаю: Invalid use of group function.
Или уже не писать такого запроса?

Это сообщение отредактировал(а) KIRINDORF - 11.3.2011, 21:26
PM MAIL   Вверх
triclosan
Дата 11.3.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



Не нормализуете данные. Зачем Song, nominac в таблице TOP?

Цитата(KIRINDORF @  11.3.2011,  21:19 Найти цитируемый пост)
SELECT Song,song_id,COUNT(song_id) FROM TOP WHERE nominacia='".$Nominac[$i]."' GROUP BY Song

некорректно выводить song_id,не группируя по этому полю

SONG{id, Song, nominac }
TOP{id, song_id}

можно вообще без MAX обойтись
Код

select s.id, count(t.id) as c
from SONG s, TOP t
where t.song_id = s.id
group by s.id
order by c desc
limit 1



PM MAIL   Вверх
KIRINDORF
Дата 12.3.2011, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Благодарю за помощь. Что касается нормализации и избыточности - подписываюсь под всеми вашими замечаниями, но  поле Song в таблице TOP добавил на время для наглядности, а вот nominacia - необходимость. Дело в том, что каждая песня принадлежит своей номинации и из таблицы голосований нужно выбрать победителя в каждой номинации. Таким образом из таблицы TOP будут выбраны несколько записей - в каждой номинации свой победитель. Это я добавил и вот что получилось:
Код

SELECT s.id, count(t.id) as c FROM SONG s, TOP t WHERE t.song_id = s.id AND t.nominacia = '".$Nominac[$i]."' GROUP BY s.id ORDER BY c DESC LIMIT 1

Все работает великолепно smile , но если я добавил что-то не туда, буду признателен за ценную информацию.
Попутно с этим нужно выбрать песню-оутсайдера, находясь на невысоком уровне знания построения запросов, думаю не получится это впихнуть в один запрос с определением победителя. Прав ли я?
PM MAIL   Вверх
triclosan
Дата 12.3.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



не нужен вам nominacia  в TOP, если SONG.id - уникален:

Код

SELECT s.id, count(t.id) as c FROM SONG s, TOP t WHERE t.song_id = s.id AND s.nominacia = '".$Nominac[$i]."' GROUP BY s.id ORDER BY c DESC LIMIT 1


nominacia  в TOP нужен, если можно голосовать за одну и ту же песню в разных номинациях, например:

Ласковый май - "Белые розы" представлен одновременно в номинации "попса" и "советская музыка", и надо учитывать в какой из них проголосовали. Но тогда необходимо переделать структуру данных немного

Это сообщение отредактировал(а) triclosan - 12.3.2011, 13:31
PM MAIL   Вверх
triclosan
Дата 12.3.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



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

Код

SELECT s.id, COUNT(*)
FROM SONG s, TOP t 
WHERE  t.song_id = s.id
GROUP BY s.id
ORDER BY 2 DESC
LIMIT 1



Код

SELECT s.id, COUNT(*)
FROM SONG s, TOP t 
WHERE  t.song_id = s.id
GROUP BY s.id
ORDER BY 2
LIMIT 1


Но в случае одинакового количества голосов в одной из этих групп будет выведена всего лишь одна запись, учтите это.
PM MAIL   Вверх
KIRINDORF
Дата 12.3.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Благодарю за ответ. Глубина твоих SQL-рассуждений мне, надеюсь пока, недоступна.  Поле id таблицы SONG уникально и, действительно, ничто не помешает продублировать песню но уже как принадлежащую другой номинации и ид-шник у нее будет свой. В итоге в таблице SONG окажутся две одинаковые песни но в разных номинациях и с различными id. Очевидно БД разрабатывалась в спешке, таким же знатоком БД как и я сам. Плохо быть одному, но что толку, если даже и двое, но при этом оба слепы. А пришел зрячий и вывел на кротчайший путь. Если бы ты видел, сколько строк PHP-кода я выкинул, используя твой совет smile 
Еще раз благодарю!

Это сообщение отредактировал(а) KIRINDORF - 12.3.2011, 15:26
PM MAIL   Вверх
triclosan
Дата 12.3.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



по хорошему надо бы нормализовать песни и жанры. 

я бы больше смущался того факта, что при одинаковом количестве голосов лидер выберется случайным способом. Имхо более изящнее было бы на уровне пхп анализировать и выводить результат без лимита, если вывод этого запроса оценивается не в 100ни тыс шт.
PM MAIL   Вверх
triclosan
Дата 12.3.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



Но если необходимо всю функциональность перенести на БД, то инструменты надо юзать более серьезные - хранимые процедуры, например.
PM MAIL   Вверх
KIRINDORF
Дата 12.3.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Цитата

по хорошему надо бы нормализовать песни и жанры. 

 это вопрос разработчику БД smile  Верно?
Цитата

я бы больше смущался... 

 я тоже этого смущался, но дана команда хватать первого попавшегося, критериев отбора лидера из лидеров не предоставлено.
Цитата

 ...хранимые процедуры, например

 triclosan, ты ведешь меня в глубины БД, начинает вспоминаться учеба. Вот так еще немного с тобой пообщаюсь и приобрету дополнительную квалификацию smile 
PM MAIL   Вверх
triclosan
Дата 12.3.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



Цитата(KIRINDORF @  12.3.2011,  18:13 Найти цитируемый пост)
это вопрос разработчику БД Верно?

несомненно

Цитата(KIRINDORF @  12.3.2011,  18:13 Найти цитируемый пост)
критериев отбора лидера из лидеров не предоставлено.

это не лидер из лидеров, это лидерЫ или аутсайдерЫ
PM MAIL   Вверх
KIRINDORF
Дата 12.3.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Цитата

это не лидер из лидеров, это лидерЫ или аутсайдерЫ

 если ты говоришь о том, чтобы запрос возвращал несколько песен с одинаковым макс и мин количеством голосов а потом в PHP-коде выбирать из каждого из них одного-единственного - то на это ответ уже дан. Или я тебя не понял?
PM MAIL   Вверх
triclosan
Дата 14.3.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



мы похоже друг друга не понимаем. Вот представьте, выборы президента РФ - Путин и Хакамада набрали одинаковое количество голосов избирателей, как-тто не правильно говорить, что кто-то из них победил.
PM MAIL   Вверх
KIRINDORF
Дата 15.3.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Цитата

Путин и Хакамада набрали одинаковое количество голосов избирателей
 определились два лидера, а нужен один - лидер из лидеров.
 - Так? 
 - Да!
У меня несколько песен с одинаковым количеством макс голосов.
 - Они лидеры?
 - Да!
Но мне нужна одна - лидер из лидеров!
 - Как быть?
 - Введи дополнительные критерии отбора лидера из лидеров.
 - Но у меня нет таких критериев!
 - Тогда бери любую.
 - ОК.

Все прекрасно друг друга поняли!

Это сообщение отредактировал(а) KIRINDORF - 15.3.2011, 13:06
PM MAIL   Вверх
triclosan
Дата 15.3.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



Не демократичное голосование какое-то получается... 
PM MAIL   Вверх
KIRINDORF
Дата 15.3.2011, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 11.2.2011

Репутация: нет
Всего: 1



Так не судьбу страны родной и решаю!


Это сообщение отредактировал(а) KIRINDORF - 15.3.2011, 13:14
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.