2015-08-13 4 views
0

У меня есть 2 таблицы в моей базе данных, как показано ниже:MySQL таблицы лиги

Ниже команда-Tabel:

id tname   poule 
1 ZF Eger  heren1A 
2 Pro Recco  heren1A 
3 Sintez Kazan heren1A 
4 Szolnoki VSE heren1A 
5 Sintez Kazan 2 heren1B 
6 Szolnoki VSE 2 heren1B 

И ниже игра-Tabel:

id date    hteam ateam hscore ascore gamefield poule played 
1 2008-01-01 20:00:00  1  2  0  0 Veld 1 heren1A  0 
2 2008-01-01 20:00:00  3  4  10  8 Veld 2 heren1A  1 

Код ниже выполняет sql-запрос в базе данных и выводит таблицу лиг.

SELECT poule AS Poule, 
     tname AS Team, 
     Sum(WG) AS WG, 
     Sum(W) AS W, 
     Sum(G) AS G, 
     Sum(V) AS V, 
     SUM(DV) as DV, 
     SUM(DT) AS DT, 
     SUM(S) AS S, 
     SUM(P) AS P 
FROM ( 
      SELECT hteam 
        Team, 
        IF(played = 1,1,0) WG, 
        IF(hscore > ascore,1,0) W, 
        IF(hscore = ascore,1,0) G, 
        IF(hscore < ascore,1,0) V, 
        hscore DV, 
        ascore DT, 
        hscore-ascore S, 
        CASE WHEN hscore > ascore THEN 3 WHEN hscore = ascore THEN 1 ELSE 0 END P 
      FROM games 
      WHERE played = 1 
       AND poule = ? OR played = 1 
       AND poule = ? 

      UNION ALL 
      SELECT ateam, 
        1, 
        IF(hscore < ascore,1,0), 
        IF(hscore = ascore,1,0), 
        IF(hscore > ascore,1,0), 
        ascore, 
        hscore, 
        ascore-hscore S, 
        CASE WHEN hscore < ascore THEN 3 WHEN hscore = ascore THEN 1 ELSE 0 END 
      FROM games 
      WHERE played = 1 
       AND poule = ? OR played = 1 
       AND poule = ? 
      ) AS tot 
     JOIN teams t 
      ON tot.Team=t.id 
GROUP BY Team 
ORDER BY SUM(P) DESC, s DESC 

Проблема я имею:

Команды без сыгранных матчей не выбраны, но я все еще хочу, чтобы они были выбраны потому что мне нужно, чтобы показать полную Poule, даже если нет ссылок играют. Как я могу изменить свой запрос так, чтобы позиция в лиге также показывалась, когда матч не воспроизводился?

+0

Try 'ЛЕВЫЙ JOIN' вместо просто' JOIN'? –

+1

@PraveenKumar Без перезаписи это будет ПРАВОЕ СОЕДИНЕНИЕ, но я соглашусь переписать и LEFT JOIN будет предпочтительнее. – Strawberry

ответ

2

Вы должны использовать team в качестве якоря и LEFT JOIN с вашей статистикой:

SELECT 
    t.poule, 
    t.tname AS Team, 
    IFNULL(Sum(WG), 0) AS WG, 
    IFNULL(Sum(W) , 0) AS W, 
    IFNULL(Sum(G) , 0) AS G, 
    IFNULL(Sum(V) , 0) AS V, 
    IFNULL(SUM(DV), 0) as DV, 
    IFNULL(SUM(DT), 0) AS DT, 
    IFNULL(SUM(S) , 0) AS S, 
    IFNULL(SUM(P) , 0) AS P 
FROM teams t 
     LEFT JOIN ( 
      SELECT hteam 
        Team, 
        IF(played = 1,1,0) WG, 
        IF(hscore > ascore,1,0) W, 
        IF(hscore = ascore,1,0) G, 
        IF(hscore < ascore,1,0) V, 
        hscore DV, 
        ascore DT, 
        hscore-ascore S, 
        CASE WHEN hscore > ascore THEN 3 WHEN hscore = ascore THEN 1 ELSE 0 END P 
      FROM games 
      WHERE played = 1 
       AND poule = ? OR played = 1 
       AND poule = ? 

      UNION ALL 
      SELECT ateam, 
        1, 
        IF(hscore < ascore,1,0), 
        IF(hscore = ascore,1,0), 
        IF(hscore > ascore,1,0), 
        ascore, 
        hscore, 
        ascore-hscore S, 
        CASE WHEN hscore < ascore THEN 3 WHEN hscore = ascore THEN 1 ELSE 0 END 
      FROM games 
      WHERE played = 1 
       AND poule = ? OR played = 1 
       AND poule = ? 
      ) AS tot ON tot.Team=t.id 

GROUP BY t.poule,t.tname 
ORDER BY SUM(P) DESC, s DESC 

Таким образом, все команды будут возвращены, в том числе тех, которые не имеют статистику.

РЕЗУЛЬТАТЫ *

heren1A Sintez Kazan 1 1 0 0 10 8 2 3 
heren1A Szolnoki VSE 1 0 0 1 8 10 -2 0 
heren1A ZF Eger   0 0 0 0 0 0 0 0 
heren1A Pro Recco  0 0 0 0 0 0 0 0 
heren1B Sintez Kazan 2 0 0 0 0 0 0 0 0 
heren1B Szolnoki VSE 2 0 0 0 0 0 0 0 0 
+0

С этим запросом только выбирает первый из моей команды-tabel.Таким образом, если никакие совпадения не были воспроизведены, тогда будет выбран только первый идентификатор. –

+0

Я немного изменил запрос, поскольку группировка была не совсем правильной - запрос не должен возвращать результаты i 've добавлено выше (я не фильтровал ни на одной лиге) - это исправляет проблему для вас или что-то еще? – Horia

+0

вот и все! Еще не получил нужного SQL-опыта, но быстро учился :) –

0

По умолчанию MySQL JOIN s - INNER JOIN s. Вам нужно LEFT JOIN:

SELECT 
    poule AS Poule, 
    tname AS Team, 
    Sum(WG) AS WG, 
    Sum(W) AS W, 
    Sum(G) AS G, 
    Sum(V) AS V, 
    SUM(DV) as DV, 
    SUM(DT) AS DT, 
    SUM(S) AS S, 
    SUM(P) AS P 
FROM 
    (
     SELECT 
      hteam Team, 
      IF(played = 1, 1, 0) WG, 
      IF(hscore > ascore, 1, 0) W, 
      IF(hscore = ascore, 1, 0) G, 
      IF(hscore < ascore, 1, 0) V, 
      hscore DV, 
      ascore DT, 
      hscore - ascore S, 
      CASE WHEN hscore > ascore THEN 3 WHEN hscore = ascore THEN 1 ELSE 0 END P 
     FROM 
      games 
     WHERE 
      played = 1 
      AND poule = ? 
      OR played = 1 
      AND poule = ? 
     UNION ALL 
     SELECT 
      ateam, 
      1, 
      IF(hscore < ascore, 1, 0), 
      IF(hscore = ascore, 1, 0), 
      IF(hscore > ascore, 1, 0), 
      ascore, 
      hscore, 
      ascore - hscore S, 
      CASE WHEN hscore < ascore THEN 3 WHEN hscore = ascore THEN 1 ELSE 0 END 
     FROM 
      games 
     WHERE 
      played = 1 
      AND poule = ? 
      OR played = 1 
      AND poule = ? 
    ) as tot 
    LEFT JOIN teams t ON tot.Team = t.id 
GROUP BY 
    Team 
ORDER BY 
    SUM(P) DESC, 
    s DESC 
+0

Я смущен, что вы подразумеваете под этим утверждением * По умолчанию MySQL JOINs - INNER JOINs. * ??? В каждой СУБД 'JOIN' означает' INNER JOIN', если иначе вы явно не указали использование 'OUTER JOIN'. – Rahul

+0

@Praveen, даже если вы измените запрос на использование 'LEFT JOIN', как указано выше, это не изменит ситуацию, если вы не используете таблицу' commands' в качестве таблицы привязки (слева от 'LEFT JOIN'. – Horia