Originariamente inviata da
optime
non capisco la query, le UNION sembrano tutte uguali...
Ok, ripartiamo da capo , allora le tabelle dove recupera i dati questa ENORME query è così:
codice:
--
-- Dumping data for table `partite_SerieA`
--
INSERT INTO `partite_SerieA` (`id_partita`, `sq_casa`, `sq_osp`, `gol_sq_casa_and`, `gol_sq_osp_and`, `gol_sq_casa_rit`, `gol_sq_osp_rit`, `id_giornata_and`, `id_giornata_rit`, `id_stagione`) VALUES
(20, 52, 46, '3', '2', '1', '2', 3, 20, 1),
(19, 72, 64, '2', '1', '2', '2', 3, 20, 1),
(18, 66, 46, '3', '1', '0', '1', 2, 19, 1),
(17, 70, 30, '9', '0', '0', '1', 2, 19, 1),
(16, 5, 72, '1', '0', '0', '4', 2, 19, 1),
ecc...
Con una JOIN a questa tabella per recuperare i nomi delle squadre:
codice:
--
-- Dumping data for table `squadre_SerieA`
--
INSERT INTO `squadre_SerieA` (`id_squadra`, `nome_squadra`, `scudetti`) VALUES
(1, 'Alessandria', 0),
(4, 'Pro Patria', 0),
(5, 'Pro Vercelli', 7),
(63, 'Sampdoria', 1),
(10, 'Treviso', 0),
(11, 'Pistoiese', 0),
(12, 'Carpi', 0),
ecc...
questa parte somma i punteggi, i pareggi, le partite, le sconfitte, i gol fatti e subiti, e poi fa una differenza tra i fatti e subiti per avere la differenza reti. Nella funzione IF() mi differenzia il punteggio se sono 2 punti a vittoria o 3 punti a vittoria con l'alias AS "vit_2p" e "vit_3p".
codice:
SELECT squadra,nome_squadra,
SUM(if(fatti!='',1,0)) AS partite,
SUM(if(punteggio=2,1,0)) AS vit_2p,
SUM(if(punteggio=3,1,0)) AS vit_3p,
SUM(if(punteggio=1,1,0)) AS pareggi,
SUM(if(punteggio=0 AND fatti!= '',1,0)) AS sconfitte,
SUM(punteggio) AS punteggio,
SUM(fatti) AS fatti,
SUM(subiti) AS subiti,
SUM(fatti)-SUM(subiti) AS diff_reti
FROM...
Questa prima SELECT recupera i dati dalla tabella spiegata sopra e fa i confronti con il comando CASE per determinare i punteggi. Il comendo WHERE filtra l'id_stagione minore di 63 che sono le stagioni con i 2 punti.
codice:
SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
CASE
WHEN gol_sq_casa_and > gol_sq_osp_and THEN 2
WHEN gol_sq_casa_and = gol_sq_osp_and AND gol_sq_casa_and <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione < '63'
UNION ALL
SELECT sq_osp AS squadra, gol_sq_osp_and AS fatti, gol_sq_casa_and AS subiti,
CASE
WHEN gol_sq_osp_and > gol_sq_casa_and THEN 2
WHEN gol_sq_osp_and = gol_sq_casa_and AND gol_sq_osp_and <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione < '63'
UNION ALL
SELECT sq_casa AS squadra, gol_sq_casa_rit AS fatti, gol_sq_osp_rit AS subiti,
CASE
WHEN gol_sq_casa_rit > gol_sq_osp_rit THEN 2
WHEN gol_sq_casa_rit = gol_sq_osp_rit AND gol_sq_casa_rit <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione < '63'
UNION ALL
SELECT sq_osp AS squadra, gol_sq_osp_rit AS fatti, gol_sq_casa_rit AS subiti,
CASE
WHEN gol_sq_osp_rit > gol_sq_casa_rit THEN 2
WHEN gol_sq_osp_rit = gol_sq_casa_rit AND gol_sq_osp_rit <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione < '63'
Questa seconda SELECT fa la stessa cosa ma con WHERE filtra l'id_stagione >= 63 che sono i campionati con i 3 punti.
codice:
SELECT sq_casa AS squadra, gol_sq_casa_and AS fatti, gol_sq_osp_and AS subiti,
CASE
WHEN gol_sq_casa_and > gol_sq_osp_and THEN 3
WHEN gol_sq_casa_and = gol_sq_osp_and AND gol_sq_casa_and <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione >= '63'
UNION ALL
SELECT sq_osp AS squadra, gol_sq_osp_and AS fatti, gol_sq_casa_and AS subiti,
CASE
WHEN gol_sq_osp_and > gol_sq_casa_and THEN 3
WHEN gol_sq_osp_and = gol_sq_casa_and AND gol_sq_osp_and <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione >= '63'
UNION ALL
SELECT sq_casa AS squadra, gol_sq_casa_rit AS fatti, gol_sq_osp_rit AS subiti,
CASE
WHEN gol_sq_casa_rit > gol_sq_osp_rit THEN 3
WHEN gol_sq_casa_rit = gol_sq_osp_rit AND gol_sq_casa_rit <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione >= '63'
UNION ALL
SELECT sq_osp AS squadra, gol_sq_osp_rit AS fatti, gol_sq_casa_rit AS subiti,
CASE
WHEN gol_sq_osp_rit > gol_sq_casa_rit THEN 3
WHEN gol_sq_osp_rit = gol_sq_casa_rit AND gol_sq_osp_rit <> '' THEN 1
ELSE 0
END AS punteggio
FROM partite_SerieA WHERE id_stagione >= '63'
L'ultima parte fa la JOIN con la tebella per recuperare i nomi delle squadre, li raggruppa e li ordina con il punteggio TOTALE più alto, la differenza reti, i gol fatti, e alla fine il nome della squadra.
codice:
JOIN squadre_SerieA ON squadra=squadre_SerieA.id_squadra
GROUP BY squadra
ORDER BY punteggio DESC, diff_reti DESC, fatti DESC, nome_squadra
Ecco, la query in sè funziona bene e calcola tutto correttamente, il problema sorge quando voglio differenziare due colonne con i punteggi dei campionati da 2 punti e quelli con i 3 punti a vittoria, perchè ora il campo "punteggio" è il totale. Come posso dividere le cose?