Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

potrebno resenje problema

[es] :: MySQL :: potrebno resenje problema

[ Pregleda: 2322 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.sbb.rs.



+1 Profil

icon potrebno resenje problema06.03.2012. u 20:55 - pre 146 meseci
Ako neko ima malo slobodnog vremena i ako zeli, moze da mi pomogne oko resenja ovog problema.

Imam 3 tabele: tblName, tblNameSport, tblSport.
tblName sadrzi imena osoba.
tblNameSport je joint table, koja povezuje tblName i tblSport, i govori nam koje sportove koje osobe treniraju.
tblSport sadrzi imena sportova.

Ono sto ja zelim da postignem, jeste da napisem upit koji ce da mi izbaci koje sportove osobe ne treniraju.

Znaci rezultat treba ovako da izgleda:
Zoran | Kosarka, Boks, Atletika, Veslanje
Goran | Kosarka, Boks, Veslanje
Predrag | Fudbal, Boks, Atletika, Biciklizam, Veslanje
Milan | Fudbal, Kosarka, Boks, Atletika, Veslanje
Vladimir | Atletika, Biciklizam, Veslanje
Marko | Fudbal, Kosarka, Boks, Atletika, Biciklizam, Veslanje

Ovo je ono sto je potrebno za kreiranje baze podataka i tabele i njihovog sadrzaja u mysql-u:

Code:
CREATE DATABASE sportsman;
USE sportsman;

CREATE TABLE tblName
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20)
);

INSERT INTO tblName (name) VALUES ("Zoran"), ("Goran"), ("Predrag"), ("Milan"), ("Vladimir"), ("Marko");

CREATE TABLE tblNameSport
(
    nameid INT NOT NULL,
    sportid INT NOT NULL
);

INSERT INTO tblNameSport VALUES (1, 1), (1, 5), (2, 1), (2, 4), (2, 5), (3, 2), (4, 5), (5, 1), (5, 2), (5, 3);


CREATE TABLE tblSport
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    sport VARCHAR(20)
);

INSERT INTO tblSport (sport) VALUES ("Futbal"), ("Kosarka"), ("Boks"), ("Atletika"), ("Biciklizam"), ("Veslanje");

SELECT * FROM tblName;
SELECT * FROM tblNameSport;
SELECT * FROM tblSport;
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: potrebno resenje problema07.03.2012. u 14:45 - pre 146 meseci
sta ko trenira:

Code:

mysql> select tblName.name, group_concat(tblSport.sport) from tblName join tblNameSport on tblName.id = tblNameSport.nameid join tblSport on tblNameSport.sportid=tblSport.id group by tblName.id;
+----------+------------------------------+
| name     | group_concat(tblSport.sport) |
+----------+------------------------------+
| Zoran    | Biciklizam,Futbal            |
| Goran    | Futbal,Atletika,Biciklizam   |
| Predrag  | Kosarka                      |
| Milan    | Biciklizam                   |
| Vladimir | Futbal,Kosarka,Boks          |
+----------+------------------------------+
5 rows in set (0.00 sec)


sta ko NE trenira je na zalost malo kompleksnije:

Code:

mysql> select name, (select group_concat(sport) from tblSport where id not in (select sportid from tblNameSport where nameid=N.id)) sportovi from tblName N;
+----------+--------------------------------------------------+
| name     | sportovi                                         |
+----------+--------------------------------------------------+
| Zoran    | Kosarka,Boks,Atletika,Veslanje                   |
| Goran    | Kosarka,Boks,Veslanje                            |
| Predrag  | Futbal,Boks,Atletika,Biciklizam,Veslanje         |
| Milan    | Futbal,Kosarka,Boks,Atletika,Veslanje            |
| Vladimir | Atletika,Biciklizam,Veslanje                     |
| Marko    | Futbal,Kosarka,Boks,Atletika,Biciklizam,Veslanje |
+----------+--------------------------------------------------+
6 rows in set (0.00 sec)

 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.sbb.rs.



+1 Profil

icon Re: potrebno resenje problema08.03.2012. u 00:22 - pre 146 meseci
Hvala vam mnogo Bogdane, mnogo ste mi pomogli.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: potrebno resenje problema08.03.2012. u 10:25 - pre 146 meseci
obrati paznju da je taj upit za "ko sta ne trenira" ultra "spor" i "smara" i "ne valja" i .... posto generalno baza nije projektovana tako da taj podatak lako vadis (retko koja jeste posto takav podatak realno retko treba) ... ako ti takav podatak treba "cesto" a ne samo za poneki report, onda razmisli da redizajniras bazu ... mada generalno "ko nije" nikad nije nesto lagan zahtev za projektovanje
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.sbb.rs.



+1 Profil

icon Re: potrebno resenje problema08.03.2012. u 11:38 - pre 146 meseci
Ovaj primer je smisljen u svrhu ucenja i boljeg razumevanja ovakvih mysql upita.
Bas zbog toga dela "ko sta ne trenira".
Ne mogu nikako te stvari da slozim u glavi, pa mi je trebalo pojasnjenje nekog ovakvog primera.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: potrebno resenje problema08.03.2012. u 12:02 - pre 146 meseci
Obrati pažnju da je group_concat jedna od mnogih lepih stvari koja postoji samo u MySql-u, a ne postoji ni u jednoj drugoj bazi. Ako želiš da naučiš SQL, probaj da ovo uradiš bez ove funkcije i videćeš kako je komplikovano dobiti ovakav rezultat na bilo kojoj drugoj bazi.
Sa druge strane, ako pokušavaš da napraviš SQL upite koji će raditi na svakoj bazi, dobićeš kod koji ne radi optimalno ni na jednom okruženju. Zato, ako ti je fokus isključivo MySQL, samo navali, biće posla za tebe!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: potrebno resenje problema08.03.2012. u 12:12 - pre 146 meseci
Citat:
velimzo: Ne mogu nikako te stvari da slozim u glavi, pa mi je trebalo pojasnjenje nekog ovakvog primera.


da li je resenje jasno ili treba pojasnjenje?
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.sbb.rs.



+1 Profil

icon Re: potrebno resenje problema09.03.2012. u 01:29 - pre 146 meseci
Nije potrebno pojasnjenje upita...novitet je samo group_concat, sto me je nateralo da pretrazim malo Reference Manual od MySQL-a, i otkrijem da tamo ima na desetine raznih funkcija. Tako da cu morati to da proucavam ubuduce.
Inace pre nego sam dobio resenje od vas pokusao sam sa prijateljicom da napisem upit, i dobili smo resenje, tako sto smo napravili CROSS JOIN pa od njega oduzeli sve one podatke koje nudi tabela tblNameSport:

Code:
SELECT tblName.name, tblSport.sport
FROM tblName
CROSS JOIN tblSport
WHERE (tblName.name, tblSport.sport) NOT IN (SELECT N.name, S.sport FROM tblname N, tblnamesport NS, tblSport S WHERE N.id=NS.nameid AND NS.sportid=S.id )
ORDER BY tblName.name;


Problem je bio sloziti podatke, u ovakvom poretku kako sam ja zahtevao. Ovim upitom se dobiju sve kombinacije imena sa sportom koji se ne trenira.
Goran | Boks
Goran | Veslanje
Goran | Kosarka
Marko | Fudbal
...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: potrebno resenje problema09.03.2012. u 12:37 - pre 146 meseci
generalno ne mozes ocekivati od rdbms-a da ti vadi podatke u takvom obliku .. mysql ima group_concat() uglavnom zato sto je u startu pravljen za web i sto 90% korisnika nije imalo blage veze sa bazama podataka pa su im modeli bili losi, zahtevi pogresni etc etc .. pa je to mysql resio velikom brzinom i fancy funkcijama kao sto je group_concat ..

 
Odgovor na temu

[es] :: MySQL :: potrebno resenje problema

[ Pregleda: 2322 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.