
 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ì:
, 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?