За последние 24 часа нас посетили 15987 программистов и 1537 роботов. Сейчас ищет 901 программист ...

Запрос на выборку по условию

Тема в разделе "MySQL", создана пользователем Vladislav_Yushkin, 20 сен 2008.

  1. Vladislav_Yushkin

    Vladislav_Yushkin Активный пользователь

    С нами с:
    19 июн 2007
    Сообщения:
    71
    Симпатии:
    0
    Подскажите, пожалуйста.

    Есть две таблицы

    Первая

    Код (Text):
    1.  
    2. id team1 team2 score1 score2
    3. 1  1     2     3      1
    4. 2  1     3     3      1
    5. 3  1     2     5      2
    6. 4  1     2     2      3
    Вторая

    Код (Text):
    1.  
    2. id team player
    3. 1  2    1
    4. 2  1    1
    5. 3  2    1
    6. 4  2    1
    7. 1  2    2
    8. 1  2    3
    В первой записаны команды которые играли и результат игры
    А во второй
    id-игры и команда за которую играл игрок
    Возможно ли записать такой запрос который бы определял количество побед, ничих и поражений у каждого игрока, для тех игр в которых он учавствовал?

    Структура первой таблицы может иметь следующий вид, но желательно что бы она была в первом представленном варианте...

    Код (Text):
    1.  
    2. id team1 team2 score1 score2 wins1 ties wins2
    3. 1  1     2     3      1      1     0    0
    4. 2  1     3     3      1      1     0    0
    5. 3  1     2     5      2      1     0    0
    6. 4  1     2     2      3      0     0    1
    Подскажите, кто сможет, а то у меня в голове решение никак не рождается...
     
  2. Vladislav_Yushkin

    Vladislav_Yushkin Активный пользователь

    С нами с:
    19 июн 2007
    Сообщения:
    71
    Симпатии:
    0
    Я придумал, вот

    [sql]
    select a.id,team1,team2,score1,score2,b.id,team,player,
    if (b.team=a.team1,score1,score2) plus,
    if (b.team=a.team1,score2,score1) minus,
    if (if (b.team=a.team1,score1,score2)>if (b.team=a.team1,score2,score1),1,0) wins,
    if (if (b.team=a.team1,score1,score2)=if (b.team=a.team1,score2,score1),1,0) ties,
    if (if (b.team=a.team1,score1,score2)<if (b.team=a.team1,score2,score1),1,0) losses
    from table1 a,table2 b where a.id=b.id
    [/sql]

    В результате выдает

    Код (Text):
    1.  
    2. id team1 team2 score1 score2  id team player plus minus wins ties losses
    3. 1  1     2     3      1       1  2    1      1     3    0    0    1
    4. 1  1     2     3      1       1  2    2      1     3    0    0    1
    5. 1  1     2     3      1       1  2    3      1     3    0    0    1
    6. 2  1     3     3      1       2  1    1      3     1    1    0    0
    7. 3  1     2     5      2       3  2    1      2     5    0    0    1
    8. 4  1     2     2      3       4  2    1      3     2    1    0    0
    но слишком громоздко, может кто подскажет как это можно оптимизировать...
     
  3. Vladislav_Yushkin

    Vladislav_Yushkin Активный пользователь

    С нами с:
    19 июн 2007
    Сообщения:
    71
    Симпатии:
    0
    Вот... новая проблемма...

    По полученным полям - wins, ties, losses не выполняется операция суммирования (SUM)...
     
  4. Vladislav_Yushkin

    Vladislav_Yushkin Активный пользователь

    С нами с:
    19 июн 2007
    Сообщения:
    71
    Симпатии:
    0
    Вот еще одна идея...

    [sql]
    SELECT player, SUM(b.score1),SUM(c.score2),SUM(b.score2),SUM(c.score1),
    SUM(b.wins),SUM(c.losses),SUM(b.ties),SUM(c.ties),SUM(b.losses),SUM(c.wins)
    FROM table2 a LEFT OUTER JOIN table1 b ON a.team=b.team1 AND a.id=b.id
    LEFT OUTER JOIN table1 c ON a.team=c.team2 AND a.id=c.id GROUP BY player
    [/sql]

    Но в этом случае требуется хранить в первой таблице три дополнительных поля wins, ties, losses.
    А еще невозможно написать SUM(b.score1)+SUM(c.score2), так как происходит сложение по следующему правилу NULL + 3 = NULL, а нужно что бы получалось - 3.

    Может кто подскажет как с этим справиться...
     
  5. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Интересно самому с собой беседовать ? :( :( :(
    SELECT IFNULL(a, b) AS result // a = NULL, b = 3; result = 3
     
  6. Vladislav_Yushkin

    Vladislav_Yushkin Активный пользователь

    С нами с:
    19 июн 2007
    Сообщения:
    71
    Симпатии:
    0
    IFNULL - это самое то.
    А возможно как нибуть произвести группировку и посчитать сумму по полученным полям в первом варианте решения? Может у кого будут идеи.
     
  7. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    SELECT( SUM( IFNULL(field1, 0)) + SUM( IFNULL(field2, 0))) AS result
     
  8. Vladislav_Yushkin

    Vladislav_Yushkin Активный пользователь

    С нами с:
    19 июн 2007
    Сообщения:
    71
    Симпатии:
    0
    В качестве первого я имел ввиду вот этот вариант
    [sql]
    select a.id,team1,team2,score1,score2,b.id,team,player,
    if (b.team=a.team1,score1,score2) plus,
    if (b.team=a.team1,score2,score1) minus,
    if (if (b.team=a.team1,score1,score2)>if (b.team=a.team1,score2,score1),1,0) wins,
    if (if (b.team=a.team1,score1,score2)=if (b.team=a.team1,score2,score1),1,0) ties,
    if (if (b.team=a.team1,score1,score2)<if (b.team=a.team1,score2,score1),1,0) losses
    from table1 a,table2 b where a.id=b.id
    [/sql]

    Возможно ли по нему получить сумму?
     
  9. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    SELECT SUM( IFNULL(score1, 0) + IFNULL(scoure2, 0)) AS nativeScore