![]() |
|
Модераторы: skyboy |
![]()
|
|
| KIRINDORF |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
Первая таблица SONG имеет поля: id - идентификатор записи, Song - собственно песня, nominac - номинация песни(например, рок, поп, ретро...). Производится процедура голосования за песни. Голоса заносятся в таблицу TOP, у которой поля: song_id - идентификатор песни из таблицы SONG, Song - песня, nominac - номинация песни. Все. Теперь нужно определить песню-победителя по итогам голосования. Делаю такой запрос:
и затем в коде PHP из результата этого запроса определяю победителя, т.е. песню с наибольшим рейтингом, которая чаще всех встретилась в таблице TOP. А нельзя ли и эту задачу поручить MySQL? Пытаюсь нацарапать следующее:
получаю: Invalid use of group function. Или уже не писать такого запроса? Это сообщение отредактировал(а) KIRINDORF - 11.3.2011, 21:26 |
||||
|
|||||
| triclosan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
Не нормализуете данные. Зачем Song, nominac в таблице TOP?
некорректно выводить song_id,не группируя по этому полю SONG{id, Song, nominac } TOP{id, song_id} можно вообще без MAX обойтись
|
||||
|
|||||
| KIRINDORF |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
Благодарю за помощь. Что касается нормализации и избыточности - подписываюсь под всеми вашими замечаниями, но поле Song в таблице TOP добавил на время для наглядности, а вот nominacia - необходимость. Дело в том, что каждая песня принадлежит своей номинации и из таблицы голосований нужно выбрать победителя в каждой номинации. Таким образом из таблицы TOP будут выбраны несколько записей - в каждой номинации свой победитель. Это я добавил и вот что получилось:
Все работает великолепно Попутно с этим нужно выбрать песню-оутсайдера, находясь на невысоком уровне знания построения запросов, думаю не получится это впихнуть в один запрос с определением победителя. Прав ли я? |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
не нужен вам nominacia в TOP, если SONG.id - уникален:
nominacia в TOP нужен, если можно голосовать за одну и ту же песню в разных номинациях, например: Ласковый май - "Белые розы" представлен одновременно в номинации "попса" и "советская музыка", и надо учитывать в какой из них проголосовали. Но тогда необходимо переделать структуру данных немного Это сообщение отредактировал(а) triclosan - 12.3.2011, 13:31 |
|||
|
||||
| triclosan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
для вывода лидера и аутсайдера предлагаю воспользоваться такими запросами соответственно:
Но в случае одинакового количества голосов в одной из этих групп будет выведена всего лишь одна запись, учтите это. |
||||
|
|||||
| KIRINDORF |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
Благодарю за ответ. Глубина твоих SQL-рассуждений мне, надеюсь пока, недоступна. Поле id таблицы SONG уникально и, действительно, ничто не помешает продублировать песню но уже как принадлежащую другой номинации и ид-шник у нее будет свой. В итоге в таблице SONG окажутся две одинаковые песни но в разных номинациях и с различными id. Очевидно БД разрабатывалась в спешке, таким же знатоком БД как и я сам. Плохо быть одному, но что толку, если даже и двое, но при этом оба слепы. А пришел зрячий и вывел на кротчайший путь. Если бы ты видел, сколько строк PHP-кода я выкинул, используя твой совет
Еще раз благодарю! Это сообщение отредактировал(а) KIRINDORF - 12.3.2011, 15:26 |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
по хорошему надо бы нормализовать песни и жанры.
я бы больше смущался того факта, что при одинаковом количестве голосов лидер выберется случайным способом. Имхо более изящнее было бы на уровне пхп анализировать и выводить результат без лимита, если вывод этого запроса оценивается не в 100ни тыс шт. |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
Но если необходимо всю функциональность перенести на БД, то инструменты надо юзать более серьезные - хранимые процедуры, например.
|
|||
|
||||
| KIRINDORF |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
это вопрос разработчику БД
я тоже этого смущался, но дана команда хватать первого попавшегося, критериев отбора лидера из лидеров не предоставлено.
triclosan, ты ведешь меня в глубины БД, начинает вспоминаться учеба. Вот так еще немного с тобой пообщаюсь и приобрету дополнительную квалификацию |
||||||
|
|||||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
||||
|
||||
| KIRINDORF |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
если ты говоришь о том, чтобы запрос возвращал несколько песен с одинаковым макс и мин количеством голосов а потом в PHP-коде выбирать из каждого из них одного-единственного - то на это ответ уже дан. Или я тебя не понял? |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
мы похоже друг друга не понимаем. Вот представьте, выборы президента РФ - Путин и Хакамада набрали одинаковое количество голосов избирателей, как-тто не правильно говорить, что кто-то из них победил.
|
|||
|
||||
| KIRINDORF |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
- Так? - Да! У меня несколько песен с одинаковым количеством макс голосов. - Они лидеры? - Да! Но мне нужна одна - лидер из лидеров! - Как быть? - Введи дополнительные критерии отбора лидера из лидеров. - Но у меня нет таких критериев! - Тогда бери любую. - ОК. Все прекрасно друг друга поняли! Это сообщение отредактировал(а) KIRINDORF - 15.3.2011, 13:06 |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
Не демократичное голосование какое-то получается...
|
|||
|
||||
| KIRINDORF |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 11.2.2011 Репутация: нет Всего: 1 |
Так не судьбу страны родной и решаю!
Это сообщение отредактировал(а) KIRINDORF - 15.3.2011, 13:14 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |