Vytvorenie tabuľky tímov – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vytvorenie tabuľky tímov – MySQL – Fórum – Programujte.comVytvorenie tabuľky tímov – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Kent0
Stálý člen
4. 4. 2015   #1
-
0
-

Ahojte
mám 3 tabuľky - league,result,club. Tabuľka 'league' obsahuje ID a názov ligy. Tabuľka 'result' obsahuje ID,ID ligy, ID domáceho tímu, ID hosťujúceho tímu, góly domáceho tímu, góly hosťujúceho tímu. Tabuľka 'club' obsahuje ID,názov tímu, ID ligy. 

Připojen obrázek.


Úlohou je vytvoriť tabuľku tímov pre vybranú ligu podľa výsledkov. Klasicky za výhru sú 3 body za remízu 1 bod a prehra 0. Neviem si s tým rady. 
Viem si vybrať tímy, ktoré vyhrali doma aj vonku ale ten select viem spraviť samostatne. 
 

SELECT  id as team_id,name, vitazstva_doma as body
FROM 
	(SELECT c.id,c.name, COUNT(name) * 3 as vitazstva_doma
	FROM club c
	JOIN result r ON r.id_home_team = c.id
	WHERE r.goal_home > r.goal_away 
	GROUP BY c.id) as vitazne_doma
--pre vitazstva vonku podobne

Keď to mám spojiť dokopy to mi už nefunguje a neviem ako presne tam zahrnúť aj ID ligy aby keď tam bude viac výsledkov pre viac líg spravilo tabuľku pre vybranú ligu. 

Za každú radu budem vďačný. 
 

Nahlásit jako SPAM
IP: 77.234.226.–
peter
~ Anonymní uživatel
4016 příspěvků
7. 4. 2015   #2
-
0
-

UNION, UNION ALL, ... - se spojuji vysledky selectu, ale musi souhlasit pocet sloupcu a i nazvy.

SELECTy musis tvorit podle toho, co se ma vyhledat. Delat univerzalni select na vsechny podminky obvykle vede k pomalemu hledani.

Sloupce je dobre pojmenovat stejne. Mas tabulku league, pak id bych nazval id_league. Mas tabulku result, mas v ni sloupec id_league. Jaka nahoda, oba se shoduji, takze to bude asi propojeni, ze? Kdezto, kdyz jeden nazves id a druhy id_league, tak podle nazvu tam neni viditelna spojitost.

Co te tedy zajima? Vsechny vysledky pro konkretni ligu?

SELECT 
  b.name,
  c.name,
  d.name
FROM
  result a
    LEFT JOIN league b ON b.id_league = a.id_league -- kdyz prejmenuji ten sloupec id v league
    LEFT JOIN club c ON c.id_club = a.id_home_team
    LEFT JOIN club d ON d.id_club = a.id_away_team
-- cili vysledek ted je z tabulky result a pripojuji k ni informace ze tri dalsich tabulek pro vypis
WHERE
  a.id_league = 1
ORDER BY
  c.name ASC, - seradim to podle jmen klubu
  d.name ASC
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:5075:80...–
peter
~ Anonymní uživatel
4016 příspěvků
7. 4. 2015   #3
-
0
-

Jo, tam by mozna bylo dobre pouzit alias, jinak to sql odmitne :) 

SELECT 
  b.name AS liga,
  c.name AS klub1,
  d.name AS klub2

A jestli jsou tam dva zaznamy, domaci a hoste, tak to mozna bude chtit ten select nejak upravit. Treba grupovanim podle id na vnitrnim selectu. Cili, neco jako  

SELECT 
  b.name,
  c.name,
  d.name
FROM
  (SELECT id_result,id_league,id_home_team,id_away_team ... WHERE xa.id_league = 1) a -- cili seznam id_result jako nova tabulka "a"
    LEFT JOIN league b ON b.id_league = a.id_league -- kdyz prejmenuji ten sloupec id v league
    LEFT JOIN club c ON c.id_club = a.id_home_team
    LEFT JOIN club d ON d.id_club = a.id_away_team
-- cili vysledek ted je z tabulky result a pripojuji k ni informace ze tri dalsich tabulek pro vypis
ORDER BY
  c.name ASC, - seradim to podle jmen klubu
  d.name ASC
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:5075:80...–
Kent0
Stálý člen
7. 4. 2015   #4
-
0
-

#3 peter
ďakujem za rady :) a  keď potrebujem tie tímy v poradí podľa počtu výhier a remíz(za výhru 3 body za remízu 1) tak tam musím ešte niekde vsunúť tie selecty na výber víťazstiev a remíz. A to mám spraviť cez UNION ak som dobre pochopil? 

Nahlásit jako SPAM
IP: 77.234.226.–
peter
~ Anonymní uživatel
4016 příspěvků
7. 4. 2015   #5
-
0
-

"keď potrebujem tie tímy v poradí "
Razeni se dela pres ORDER BY, ne?

UNION Pouze spojuje SELECTy. Rikal jsi, ze to umis napsat kazde zvlast.

SELECT a AS X, b AS Y FROM ...
UNION 
SELECT c AS X, d AS Y FROM ...
UNION
SELECT e AS X, f AS Y FROM ...

https://dev.mysql.com/doc/refman/5.0/en/union.html
UNION [ALL | DISTINCT] = UNION nebo UNION ALL nebo UNION DISTINCT
UNION (prunik) - spoji a odstrani duplicitni zaznamy
UNION ALL (slouceni) - spoji a necha duplicitni zaznamy (to je dobre, kdyz chces delat COUNT. Kdyz potrebujes treba dve ruzne podminky pro dve ruzne tabulky, kazda vysype seznam id a ty potrebujes vypsat jen ty, ktere jsou v obou skupinach)
UNION DISTINCT (tusim rozdil, uz jsem to taky pouzil)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:5075:80...–
Kent0
Stálý člen
8. 4. 2015   #6
-
0
-

#5 peter
skúsil som niečo takéto

SELECT  id as team_id,name as nazov, body_doma				
FROM 
	(SELECT c.id,c.name, COUNT(name) * 3 as body_doma
	FROM club c
	JOIN result r ON r.id_home_team = c.id
	WHERE r.goal_home > r.goal_away 
	GROUP BY c.id) as vitazstva_doma
UNION ALL
SELECT id as team_id, team_name as nazov, body_vonku 
FROM
	(SELECT c.id,c.name as team_name, COUNT(name) * 3 as body_vonku
	FROM club c
	JOIN result r ON r.id_away_team = c.id
	WHERE r.goal_home < r.goal_away 
	GROUP BY c.id) as vitazstva_vonku

toto mi vyhodí niečo takéto:

Připojen obrázek.

čo je vlastne dobre lebo mi tam hodilo tie tímy, ktoré vyhrali aj doma aj vonku ale keď chcem tie tabuľky už spojiť a spočítať body a zoradiť tak mi tam hodí chybu pri UNION ALL 

SELECT team_id,nazov,SUM(body_doma) + SUM(body_vonku) as body
FROM(
(SELECT  id as team_id,name as nazov, body_doma				
FROM 
	(SELECT c.id,c.name, COUNT(name) * 3 as body_doma
	FROM club c
	JOIN result r ON r.id_home_team = c.id
	WHERE r.goal_home > r.goal_away 
	GROUP BY c.id) as vit_doma) as a
UNION ALL
(SELECT id as team_id, team_name as nazov, body_vonku 
FROM
	(SELECT c.id,c.name as team_name, COUNT(name) * 3 as body_vonku
	FROM club c
	JOIN result r ON r.id_away_team = c.id
	WHERE goal_home < goal_away
	GROUP BY c.id) as vit_vonku) as b
Nahlásit jako SPAM
IP: 147.175.176.–
peter
~ Anonymní uživatel
4016 příspěvků
9. 4. 2015   #7
-
0
-

Nebude to treba tim, ze ti tam schazi nejaka zavorka?

Nebo nemas tabulku pojmenovanou? Nebo rozdilny pocet sloupcu? Nebo rozdilny alias sloupcu? Sql si tam neumi dosadit nultou hodnotu sam.

SELECT
  team_id,
  nazov,
  SUM(body_doma) + SUM(body_vonku) as body
FROM
  (
    (SELECT id as team_id, name as nazov, body_doma ...)
     -- to vytvori tabulku se sloupci: team_id, nazov, body_doma
    UNION ALL
    (SELECT id as team_id, team_name as nazov, body_vonku ...) 
     -- to vytvori tabulku se sloupci: team_id, nazov, body_vonku
  )
  -- jestli ten union projde, jakoze by nemusel, kdyz jsou sloupce pojmenovane rozdilne

-- pokud bys to chtel takto delat, tak bys musel dat ctyri sloupce

SELECT id AS team_id, name AS nazov, body_doma -- predtim
SELECT id AS team_id, name AS nazov, body_doma, 0 AS body_vonku -- potom
SELECT id AS team_id, team_name AS nazov, body_vonku -- predtim
SELECT id AS team_id, team_name AS nazov, 0 AS body_doma, body_vonku -- potom

A kdyz to nemas zgrupovane, tak ti SUM nepojede, ne? Jakoze spoji radky podle id a secte cisla ve stejne pojmenovanem sloupci.

SELECT SUM(sloupec) FROM tabulka GROUP BY id
google = mysql sum example
http://www.tutorialspoint.com/…function.htm

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:7092:30...–
Kent0
Stálý člen
9. 4. 2015   #8
-
0
-

#7 peter
upravil som to tak aby som mal 4 stĺpce rovnako pomenované, každá tabuľka má názov..aj zátvorky sedia, na konci som použil GROUP BY  ale stále píše chybu pri UNION ALL

SELECT team_id,nazov,SUM(body_doma) + SUM(body_vonku) as body
FROM
(
	(
	SELECT  id as team_id,name as nazov, body_doma	, 0 as body_vonku			--prva tabulka na vitazstva doma  
	FROM 
		(
		SELECT c.id,c.name, COUNT(name) * 3 as body_doma
		FROM club c
		JOIN result r ON r.id_home_team = c.id
		WHERE r.goal_home > r.goal_away 
		GROUP BY c.id
		) as vit_doma
	) as a
UNION ALL
	(
	SELECT id as team_id, team_name as nazov, 0 as body_doma, body_vonku 
	FROM
		(
		SELECT c.id,c.name as team_name, COUNT(name) * 3 as body_vonku
		FROM club c
		JOIN result r ON r.id_away_team = c.id
		WHERE goal_home < goal_away
		GROUP BY c.id
		) as vit_vonku
	) as b
)
GROUP BY team_id,nazov
Nahlásit jako SPAM
IP: 147.175.176.–
Řešení
peter
~ Anonymní uživatel
4016 příspěvků
9. 4. 2015   #9
-
0
-
Vyřešeno Nejlepší odpověď

Par chyb s phpmyadmina

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '--prva tabulka na vitazstva doma  
    FROM (
        SELECT c.id,c.name, COUNT(name) ' at line 5
za -- se dava mezera

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as b
)
GROUP BY team_id,nazov
LIMIT 0, 25
tabulka se aliasuje bez AS, coz je trochu zmatene, ze sloupce to zas mit musi, ale co uz. Navic, pro union nemusis davat tabulkam aliasy., takze ani a ani b tam byt nemusi

SELECT team_id,nazov,SUM(body_doma) + SUM(body_vonku) as body
FROM
(
	(
	SELECT  id as team_id,name as nazov, body_doma	, 0 as body_vonku			-- prva tabulka na vitazstva doma  
	FROM 
		(
		SELECT c.id_club as id,c.name, COUNT(name) * 3 as body_doma
		FROM kent_club c
		JOIN kent_result r ON r.id_home = c.id_club
		WHERE r.goal_home > r.goal_away 
		GROUP BY c.id_club
		) as vit_doma
	)
UNION ALL
	(
	SELECT id as team_id, team_name as nazov, 0 as body_doma, body_vonku 
	FROM
		(
		SELECT c.id_club as id,c.name as team_name, COUNT(name) * 3 as body_vonku
		FROM kent_club c
		JOIN kent_result r ON r.id_away = c.id_club
		WHERE goal_home < goal_away
		GROUP BY c.id_club
		) as vit_vonku
	)
) as x
GROUP BY team_id,nazov

-- bys mohl taky poslat sql prikazy pro vytvoreni tabulek... Pac bez tabulek se neda sql dotaz spustit v phpmyadmin
CREATE TABLE IF NOT EXISTS `kent_league` (
  `id_league` int(11) NOT NULL AUTO_INCREMENT,
  `name` text COLLATE utf8_czech_ci DEFAULT NULL,
  PRIMARY KEY (`id_league`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE IF NOT EXISTS `kent_result` (
  `id_result` int(11) NOT NULL AUTO_INCREMENT,
  `id_league` int(11) DEFAULT NULL,
  `id_home` int(11) DEFAULT NULL,
  `id_away` int(11) DEFAULT NULL,
  `goal_home` int(11) DEFAULT NULL,
  `goal_away` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_result`),
  KEY `id_league` (`id_league`),
  KEY `id_home` (`id_home`),
  KEY `id_away` (`id_away`),
  KEY `goal_home` (`goal_home`),
  KEY `goal_away` (`goal_away`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE IF NOT EXISTS `kent_club` (
  `id_club` int(11) NOT NULL AUTO_INCREMENT,
  `id_league` int(11) DEFAULT NULL,
  `name` text COLLATE utf8_czech_ci DEFAULT NULL,
  `manager` text COLLATE utf8_czech_ci DEFAULT NULL,
  `state` text COLLATE utf8_czech_ci DEFAULT NULL,
  PRIMARY KEY (`id_club`),
  KEY `id_league` (`id_league`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


Nahlásit jako SPAM
IP: 2001:718:2601:1f7:7092:30...–
peter
~ Anonymní uživatel
4016 příspěvků
9. 4. 2015   #10
-
0
-

#1248 - Every derived table must have its own alias
Tabulka vytvorena ze selectu musi mit alias to je ten kod na konci

) as x

a tez jsem tam zrusil tusim grupovani podle nazvu.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:7092:30...–
Kent0
Stálý člen
9. 4. 2015   #11
-
0
-

#9 peter
prepáč mohol som tu dať príkazy na vytvorenie tabuliek na to som zabudol

každopádne mi to už funguje..ja používam pgAdmin a tam mi tie chyby neukazovalo..

ten poznatok, že tabuľka sa aliasuje bez AS som prehliadol 

Ďakujem za každú radu :) 

Nahlásit jako SPAM
IP: 147.175.176.–
peter
~ Anonymní uživatel
4016 příspěvků
10. 4. 2015   #12
-
0
-

Ty jo, ja tu rikam, ze se to aliasuje bez AS a koukam, ze to v tech prikazech mam tvoji verzi a ta asi fungovala taky :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:dff:46f...–
Kent0
Stálý člen
26. 4. 2015   #13
-
0
-

#12 peter
Narazil som znovu na problém s týmto selectom. Musím ho nejako implementovať do O/R mapovača Hibernate. Vedel by si mi povedať ako na to? Možno cez createCriteria a nejaké aliasy ale nenapadá ma vôbec žiadny spôsob. 

Nahlásit jako SPAM
IP: 147.175.176.–
peter
~ Anonymní uživatel
4016 příspěvků
27. 4. 2015   #14
-
0
-

Ne.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:f432:d2...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý