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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из двух связных таблиц 
V
    Опции темы
Wolf1994
Дата 12.5.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

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



В дополнение к теме: http://forum.vingrad.ru/forum/topic-210702.html . Как я понял существует более простое решение для вопроса поднятого там. Вот полные условия моей задачи:

Есть таблица игроков в Шахаматы и таблица сыгранных ими партий. В таблице партий для каждой игры значатся идентификаторы игроков из первой таблицы. Каждая партия имеет какой-то результат: победа одного игрока, другого, ничья, незавершённая игра. Требуется выбрать игроков из первой таблицы и упорядочить их согласно количеству вышеприведённых результатов для каждого игрока.

Как примерно должен выглядеть запрос, который выполнит поставленную задачу?
PM MAIL WWW   Вверх
Fortop
Дата 12.5.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Код

SELECT ID, COUNT(WIN), , COUNT(EQ), COUNT(DEF) FROM (
SELECT ID, 
WIN = CASE WHEN PARTY.RES = 'WIN' THEN '1' ELSE NULL END , 
EQ = CASE WHEN PARTY.RES = 'EQ' THEN '2' ELSE NULL END, 
DEF = CASE WHEN PARTY.RES = 'DEF' THEN '3' ELSE NULL END
FROM PLAYERS
LEFT JOIN PARTY ON PARTY.ID_PLAYER = PLAYERS.ID
) AS I
GROUP BY ID
ORDER BY WIN, EQ, DEF


Где-то так. Синтаксис может быть несколько не MySQL-ный, но мне лень создавать таблицы и проверять.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Wolf1994
Дата 12.5.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

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



Fortop, спасибо.

Получился такой SQL:
Код

SELECT `players`.*,COUNT(WIN) FROM (
SELECT `players`.`id`, 
WIN=CASE WHEN (`players`.`id`=`party`.`player1_id` AND `party`.`result`='black') OR (`players`.`id`=`party`.`player2_id` AND `party`.`result`='white') THEN '1' ELSE NULL END, 
FROM `players`
LEFT JOIN `party` ON `party`.`player1_id`=`players`.`id` OR `party`.`player2_id`=`players`.`id`
) AS I
GROUP BY `players`.`id`
ORDER BY WIN


Цитата(Fortop @  12.5.2008,  00:36 Найти цитируемый пост)
Синтаксис может быть несколько не MySQL-ный

Что надо здесь изменить, чтобы получился MySQL'ный синтаксис?

P.S. Перепробовал несколько вариантов, но так ничего и не добился.

PM MAIL WWW   Вверх
Fortop
Дата 12.5.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Wolf1994, посмотреть какой синтаксис имеет условный оператор в SQL запросе для MySQL

Добавлено через 1 минуту и 17 секунд
http://dev.mysql.com/doc/refman/5.1/en/con...-functions.html

Добавлено через 2 минуты и 41 секунду
Да, и для значения NULL тоже smile

Добавлено через 5 минут и 34 секунды
если оно не пройдет, то можешь просто присваивать 2 к примеру
а в запрос перед GROUP BY
добавить WHERE WIN=1

И еще такой момент не торопись со своим 
Код

SELECT `players`.*


Добейся, чтобы оно сначала работало как 
Код

SELECT id, COUNT(WIN) ...

А потом уже убедшь усложнять запрос. Потому что у тебя ошибок куча.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Wolf1994
Дата 12.5.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

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



Перепробовал кучу вариантов. Положительного результата не смог добиться. Сдаюсь. Мне это не по силам. Нужен либо работающий пример. Либо пример, с объясненим работающей логики.

Это сообщение отредактировал(а) Wolf1994 - 12.5.2008, 20:14
PM MAIL WWW   Вверх
Fortop
Дата 12.5.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Создаем статус для каждой партии и игрока. Если он победил - то 1, иначе NULL
Код

SELECT players.id,
CASE
WHEN players.id = party.pl1_id AND result='white' THEN 1 /* если игрок играл за белых pl1_id и победили белые то 1 */
WHEN players.id = party.pl2_id AND result='black' THEN 1 /* если игрок играл за черных pl2_id и победили черные то 1 */
ELSE NULL /* во всех остальных случаях NULL */
END AS wins
FROM players
LEFT JOIN party ON players.id = party.pl1_id OR players.id = party.pl2_id 
/* условие OR позволяет нам разложить партию на 2х игроков, и записей результатов мы число партий умноженое на 2 + число игроков, которые не провели ни одной партии */


Считаем сколько было побед у игроков. (значения с NULL  у нас не будут считатся)
группируем по игрокам и сортируем, чтобы максимальное количество очков было вверху.
Код

SELECT players.id, COUNT(wins) as score FROM (
/* тут стоит тот же запрос что и выше. */
) AS I
LEFT JOIN players ON players.id = I.id
GROUP BY players.id
ORDER BY score DESC


Это сообщение отредактировал(а) Fortop - 12.5.2008, 23:52


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Wolf1994
Дата 13.5.2008, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

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



Fortop, благодарю за помощь!

Вопрос решён.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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