Spojenie dvoch stĺpcov s dvomi podmienkami WHERE – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spojenie dvoch stĺpcov s dvomi podmienkami WHERE – MySQL – Fórum – Programujte.comSpojenie dvoch stĺpcov s dvomi podmienkami WHERE – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
pepko1430
Newbie
11. 6. 2019   #1
-
0
-

Ahojte

Prosím Vás, vedeli by ste mi poradiť s týmto spojením stĺpcov?

Mám tieto dva príkazy:

Prvý príkaz:


SELECT name, AVG(body) 
FROM users
JOIN bodovanie ON user_id = id_uzivatela 
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Stolové'
GROUP BY id_uzivatela ORDER BY AVG(body)

Druhý príkaz:

SELECT AVG(body)
FROM users
JOIN bodovanie ON user_id = id_uzivatela
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Akostné'
GROUP BY id_uzivatela ORDER BY AVG(body)
 

Výsledok z prvého príkazu vyzerá takto:

Připojen obrázek.

Chcel by som vedieť ako spojiť tieto dve tabuľky, že hneď vedľa by bol stĺpec z toho druhého príkazu.

Počet riadkov je tam rovnaký.

Neviem tie dve tabuľky spojiť.

Nahlásit jako SPAM
IP: 213.151.235.–
Řešení
MilanL+1
Grafoman
11. 6. 2019   #2
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#1 pepko143
ahoj.

je třeba použít subselecty, v subselectech netřeba users 

SELECT name, St.Prumer as Stolove, Ak.Prumer as Akostne, 
	(St.Prumer + Ak.Prumer)/2 as CelkemPrumer

FROM users

LEFT JOIN (
	SELECT user_id, AVG(body) as Prumer
	FROM bodovanie  
	JOIN vina ON id_vino = id_vino_b
	WHERE rada = 'Stolové'
	GROUP BY user_id) st on st.user_id=id_uzivatela
LEFT JOIN (
	SELECT user_id, AVG(body) as Prumer
	FROM bodovanie  
	JOIN vina ON id_vino = id_vino_b
	WHERE rada = 'Akostné'
	GROUP BY user_id) Ak on Ak.user_id=id_uzivatela
ORDER BY ....zde vybrat podle názvů sloupců

nevím jak máš celou tu strukturu ohledně users id, je nebudeš muset prohodit ty názvy

Nahlásit jako SPAM
IP: 91.139.9.–
pepko1430
Newbie
12. 6. 2019   #3
-
0
-

Ďakujem ti za usmernenie.

Najprv mi to nefungovalo a nerozumel som niektorým veciam, ale som si to pozrel a už mi to ide.

Super, zase viem niečo nové :-)

Takto mi to ide:

SELECT user_id, name, st.priemer as stolove, ak.priemer as akostne
FROM users

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b
			WHERE rada = 'Stolové'
			GROUP BY id_uzivatela) st on st.id_uzivatela = user_id

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b
			WHERE rada = 'Akostné'
			GROUP BY id_uzivatela) ak on ak.id_uzivatela = user_id

ORDER BY user_id
Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
13. 6. 2019   #4
-
+1
-
Zajímavé

#3 pepko143
jj jsem psal že ty názvy u ID_uzivatele a User_id mohou být přehozené, z původního nebylo tak úplně jasné co kam patří.

ty subselecty lze brát jako jakoby další tabulky

Nahlásit jako SPAM
IP: 185.112.167.–
pepko1430
Newbie
13. 6. 2019   #5
-
0
-

Prosím ťa, poradil by si mi ešte ako zakázať zobrazovanie hodnotiteľov, ktorí nič nehodnotili?

Chcel som dať podmienku IS NOT NULL k celkovému priemeru, ale neberie mi to...

SELECT user_id, name, st.priemer as stolove, ak.priemer as akostne, cl.priemer as celkovy
FROM users

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b
			WHERE rada = 'Stolové' 
			GROUP BY id_uzivatela) st on st.id_uzivatela = user_id

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b
			WHERE rada = 'Akostné' 
			GROUP BY id_uzivatela) ak on ak.id_uzivatela = user_id

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b	
			
			GROUP BY id_uzivatela) cl on cl.id_uzivatela = user_id

ORDER BY celkovy 
Nahlásit jako SPAM
IP: 213.151.235.–
pepko1430
Newbie
13. 6. 2019   #6
-
0
-

#5 pepko143

Už to mám, stačilo zmeniť LEFT na RIGHT :-)

Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
13. 6. 2019   #7
-
0
-

ten right join jsem zatím nepoužil s více subselecty, tak snad ti to funguje správně.

Jinak k tabulce uživatelů bych měl jednu připomínku, pokud name skládáš ze jména a příjmení mělo by z důvodu řazení být nejdříve příjmení a až pak jméno.

Nahlásit jako SPAM
IP: 91.139.9.–
pepko1430
Newbie
13. 6. 2019   #8
-
0
-

Ďakujem, ale to je v db pod označením name, meno a priezvisko spolu.

Celý web slúži pre interné použitie firmy, kde sa hodnotia vína a z toho vychádzajú štatistické údaje.
Určite súhlasím, že by bolo lepšie evidovať meno a priezvisko zvlášť.
Možno to neskôr zmením... zatiaľ to nehrá nejakú veľkú rolu.

Užívateľov radím v tomto danom prípade podla celkového priemerného hodnotenia.

Podľa možností sa snažím vytvoriť medzi nimi akýsi druh súťaživosti, kde sa monitoruje aj ich aktivita, aby ich to viac bavilo.

Hmm a čo sa týka toho RIGHT JOIN, tak asi by to mohlo robiť problémy.
Zmenil som teda prvé dva na LEFT a posledné celkové na RIGHT, tým pádom by sa  nemali zobrazovať nulové hodnoty užívateľov, ktorí vôbec nič nehodnotili, ale môžu sa zobrazovať hodnoty užívateľov, ktorí už začali hodnotiť, no nemajú ohodnotené ešte všetky rady... Aby to dávalo rovnaký počet riadkov. Ďakujem za pripomienku Milan.

Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
13. 6. 2019   #9
-
0
-

#8 pepko143
ještě v SQL existuje funkce COALESCE, která v případě že je hodnota NULL dokáže nastavit defaultní hodnotu.

 v tvém případě např

SELECT user_id, name, COALESCE(st.priemer,0) as stolove, COALESCE(ak.priemer,0) as akostne, COALESCE(cl.priemer,0) as celkovy

podle toho pak už můžeš udělat podmínku na tom hlavním dotazu

WHERE Celkem>0

btw dával jsi tu WHERE st:Priemer IS NOT NULL podmínku do toho hlavního dotazu na úrovni ORDER BY ?

Nahlásit jako SPAM
IP: 91.139.9.–
pepko1430
Newbie
14. 6. 2019   #10
-
0
-

#9 MilanL
Takto mi to funguje:

SELECT user_id, name, st.priemer as stolove, ak.priemer as akostne, cl.priemer as celkovy 
FROM users

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b
			WHERE rada = 'Stolové' 
			GROUP BY id_uzivatela) st on st.id_uzivatela = user_id

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b
			WHERE rada = 'Akostné' 
			GROUP BY id_uzivatela) ak on ak.id_uzivatela = user_id

LEFT JOIN (
			SELECT id_uzivatela, AVG(body) as priemer
			FROM bodovanie			
			JOIN vina ON id_vino = id_vino_b	
			
			GROUP BY id_uzivatela) cl on cl.id_uzivatela = user_id

WHERE cl.Priemer IS NOT NULL 
ORDER BY celkovy

Tu podmienku WHERE som dával pred ORDER, ale ja som to nedal ako cl.Priemer, ale ako celkovy, súdiac, že hore som to tak uložil. No a selektujem to podľa cl.Priemer, nie St.Priemer, pretože mi nevadí ak je kolónka st.priemer prázdna a iné sú plné, len ten celkový priemer ak je prázdny, nemá zmysel ukazovať užívateľa. 

Tak ďakujem upravil som to teda takto.

Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
14. 6. 2019   #11
-
0
-

#10 pepko143
oki, já jsem rád, že ta moje rada zafungovala, já to navrhuju z hlavy, navíc poslední dobou jsem s SQL moc nedělal. A to COALESCE se ti může hodit někdy v budoucnu. :D

Nahlásit jako SPAM
IP: 193.165.115.–
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, 1 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ý