Jump to content
  • 0

Выбрать победителей из БД


fiver
 Share

Question

Помогите сделать выборку из БД. Сделал кучу вложенных циклов. Вроде все работает, но в некоторых случаях получается не то что надо. Причем не понятно почему.

Дела обстоят так:

Есть куча конкурсантов, все делятся по категориям, подкатегориям и возрасту.

Например 1-1-1 = 1 категория, 1 подкатегория, 1 возраст, там 100 участников

Или 7-14-4 = 7 категория, 14 подкатегория, 4 возраст, там 50 участников,

а в 15-15-2, может быть всего один участник.

Где то участников вообще нет.

У каждого участника есть Фамилия и какое то кол-во голосов.

Что бы вывести всех участников

я делаю так:


while($w_cat < 20)
{
while($w_sub < 18)
{
while($age < 6)
{
$query = "SELECT * FROM tbl WHERE w_cat=$w_cat and w_sub=$w_sub and age=$age ORDER BY work_count DESC";

$age++;
}
$age = 1;
$w_sub++;
}
$w_sub = 1;
$w_cat++;
}

А мне надо вывести работы победителей в каждой категории, подкатегории и возрасте, но с такими условиями:

1. Всего - 3 места;

2. Если участники получили одинаковое к-во голосов, то они делят это место, неважно сколько их.

3. Один участник награждается 1 раз в одной номинации и не может занять несколько мест, только одно самое высокое.

ДЛЯ ПРИМЕРА ИМЕЕМ в 1-1-1

Вася - 200 голосов

Петя - 200 голосов

Коля - 200 голосов

Вася - 150 голосов

Вася - 100 голосов

Дима - 50 голосов

Толя - 50 голосов

Женя - 25 голосов

Гоша - 10 голосов

Результат:

1 место - Вася - 200 голосов

1 место - Петя - 200 голосов

1 место - Коля - 200 голосов

2 место - Дима - 50 голосов

2 место - Толя - 50 голосов

3 место - Женя - 25 голосов

Т.е. Вася по идее занял и 2 место и 3, но так как у него уже 1 место, то все, он убирается с других мест, а номинируются те, кто ниже его.

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

array_unique(); вам в помощь.

А как его заставить работать по нескольким фиксированным ключам?

В частности для каждой номинации 5 параметров. Три определяют саму номинацию, плюс 2 параметра Имя и Фамилия.

Можно примерчик.

Link to comment
Share on other sites

  • 0

fiver, хотел тебе помочь, но чувствую что запутался :facepalmxd: Как так получается что у тебя один и тот же человек в одной и той же категории, в одной и той же подкатегории, в одной и той же группе имеет несколько очков (т.е. несколько записей)?

Я так понимаю это ошибка проектирования базы данных :) Пример очень не удачный, при правильно проектировании дублирование не может быть (ну или не должно)

И тут вообще не зачем работать с массивом. Нужно изначально делать нужный запрос к базе. Например, сделать функцию которой отдавать категорию+подкатегорию+возраст и получать массив готового результата

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

fiver, хотел тебе помочь, но чувствую что запутался :facepalmxd: Как так получается что у тебя один и тот же человек в одной и той же категории, в одной и той же подкатегории, в одной и той же группе имеет несколько очков (т.е. несколько записей)?

Я так понимаю это ошибка проектирования базы данных :) Пример очень не удачный, при правильно проектировании дублирование не может быть (ну или не должно)

И тут вообще не зачем работать с массивом. Нужно изначально делать нужный запрос к базе. Например, сделать функцию которой отдавать категорию+подкатегорию+возраст и получать массив готового результата

Это не ошибка. Каждый участник может выложить на суд несколько работ.

Например у тебя есть 10 классных фоток и ты не знаешь какая лучше и выкладываешь на голосование все фото.

А так как у других участников фотки говно, то очень часто получается что у одного участника все 3 места за 3 разных работы.

Но он и так уже победитель и у него 1 место. поэтому 2 и 3 место должны занять другие участники, это только в 1 категории 1-1-1.

В 1-2-1 , это уже другие работы по другой теме, но в той же возрастной категории, он опять может выложить свои работы и опять занять какое то место.

Вообще сайт делал не я (меня попросили помочь с определением победителей, вот я и снашаюсь).

Там конечно есть косяки. Например информация об участнике хранится в другой таблице, и связь с таблицей с работами и номинациями осуществляется по id участника (общее поле для 2-х таблиц). Но весь прикол в том, что бы выложить работу, участник каждый раз регится заново. В итоге у участника не 1 id, а целая куча.

Поэтому надо отсекать участников не по их id, а сравнивать 2 поля Имя и Фамилия.

А они еще могут там и ошибку сделать или 1 раз написать Иван, другой Ваня, третий ИВАН.

Короче одни косяки.

Link to comment
Share on other sites

  • 0

Вот и я говорю что ошибка проектирования структуры базы!!!

У тебя участвуют не ЛЮДИ, а РАБОТЫ (ФОТОГРАФИИ). А значит баллы прибавляются работам.. А вот уже к работам привязываются пользователи.. Нужно или новое поле вводить ИМЯ_РАБОТЫ или делать согласующую таблицу пользователей. А скорее всего и то и другое.

И тогда ты просто в запросе получаешь рейтинг работ отсортированных по баллам и сгруппированных по пользователям

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

Вот и я говорю что ошибка проектирования структуры базы!!!

У тебя участвуют не ЛЮДИ, а РАБОТЫ (ФОТОГРАФИИ). А значит баллы прибавляются работам.. А вот уже к работам привязываются пользователи.. Нужно или новое поле вводить ИМЯ_РАБОТЫ или делать согласующую таблицу пользователей. А скорее всего и то и другое.

И тогда ты просто в запросе получаешь рейтинг работ отсортированных по баллам и сгруппированных по пользователям

Баллы и прибавляются работам. А к работам привязываются пользователи. Так сейчас все и есть. У каждой работы есть id_work, он уникален.

Код в первом посте выводит работы по всем категориям по кол-ву голосов.

Мне надо из этого списка убрать лишнее, работы не занявшие 1, 2 и 3 места.

Условия я все описал. 1 чел в 1 номинации не может занять 2 и более мест, и челы с одинаковым кол-м голосов делят место.

Все.

Но никак не могу сделать.

На данный момент я могу вывести 1, 2, 3 места с учетом одинакового кол-ва голосов.

Никак не смекну, как граматно удалить людей занявших несколько мест.

Edited by fiver
Link to comment
Share on other sites

  • 0

ну в принципе тебе ответ уже дали.. Воспользуйся сортировкой по количеству баллов по убыванию, сгруппируй по идентификатору пользователя и баллам и в LIMIT поставь три записи

Link to comment
Share on other sites

  • 0

ну в принципе тебе ответ уже дали.. Воспользуйся сортировкой по количеству баллов по убыванию, сгруппируй по идентификатору пользователя и баллам и в LIMIT поставь три записи

ну во первых в LIMIT 3 записи ставить нельзя. Т.к. записей может быть более.

1 место - Вася - 200 голосов

1 место - Петя - 200 голосов

1 место - Коля - 200 голосов

2 место - Дима - 50 голосов

2 место - Толя - 50 голосов

3 место - Женя - 25 голосов

Вот 5 записей. В примере в 1 посту.

Подскажи, как сделать цикл, по удалению конкурсантов занявших несколько мест.

Link to comment
Share on other sites

  • 0

ну во первых в LIMIT 3 записи ставить нельзя. Т.к. записей может быть более.

ну да ну да :)

Подскажи, как сделать цикл, по удалению конкурсантов занявших несколько мест.

Ну так уже сказали воспользоваться GROUP BY

Link to comment
Share on other sites

  • 0

ну во первых в LIMIT 3 записи ставить нельзя. Т.к. записей может быть более.

ну да ну да :)

Подскажи, как сделать цикл, по удалению конкурсантов занявших несколько мест.

Ну так уже сказали воспользоваться GROUP BY

По поводу GROUP BY. Группировать что ли по имени и фамилии?

Для этого надо сделать многотабличный запрос?

Ну и дальше что, предположим я вывел всех по Именам и Фамилиям.

Как мне убрать лишних?

Помоги пожалуйста составить 1 запрос на извлечение из 2-ч таблиц.

вот код на извлечение из 2-х таблиц


SELECT * FROM works WHERE w_cat=$w_cat and w_sub=$w_sub and age=$age and competition_id=165 ORDER BY work_count DESC
$users = $catg['user_id'];
SELECT * FROM users WHERE user_id=$users

поле user_id общее для обеих таблиц

Edited by fiver
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy