[ nezki @ 01.04.2013. 10:51 ] @
Da li u mysql-u postoji opcija za polja ciji je tip ENUM ili SET da podesim da vrednost iz tih polja mogu biti samo vrednosti iz odredjene tabele

To je nesto kao COMBO BOX U accessu

Na primer da za ENUM vrednost kazem nesto tipa "SELECT name FROM table2"
[ bogdan.kecman @ 01.04.2013. 12:58 ] @

http://dev.mysql.com/doc/refma...b-foreign-key-constraints.html
[ nezki @ 01.04.2013. 13:11 ] @
Znam na sta mislis da mi to polje bude strani kljuc.
Ali mi to ne resava situaciju

Evo primera, pa da vidis sta je problem:

Imam na primer dve tabele:
Code:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ime` varchar(20) DEFAULT NULL,
  `fakultet_1` int(11) DEFAULT NULL,
  `fakultet_2` int(11) DEFAULT NULL,
  `fakultet_3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fakultet_1` (`fakultet_1`,`fakultet_2`,`fakultet_3`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `fakultet` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naziv` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;



Potreban mi je jedan upit gde cu dobiti sve podatke odjednom, i to sam resio ovako
Code:

SELECT id, ime, (SELECT naziv FROM fakultet WHERE fakultet.id = student.fakultet_1) AS fakultet_1, (SELECT naziv FROM fakultet WHERE fakultet.id = student.fakultet_2) AS fakultet_2, (SELECT naziv FROM fakultet WHERE fakultet.id = student.fakultet_3 AS fakultet_3 FROM student


I tako sam dobio sve vrednosti sa jednim upitom.

Medjutim sada mi treba da odradim pretragu i sortiranje bas po nazivu fakulteta u jednom upitu

Ovako nesto :
Code:

$search = "ETF";

SELECT * FROM student WHERE fakultet_1 IN (SELECT id FROM fakultet WHERE naziv LIKE '%$search%') OR fakultet_2 IN (SELECT id FROM fakultet WHERE naziv LIKE '%$search%') OR fakultet_3 IN (SELECT id FROM fakultet WHERE naziv LIKE '%$search%') ORDER BY fakultet_1;



E sad tu je problem kako da odradim order po nazivu fakulteta? S tim da nekad necu imati uvek pretragu, imacu samo sortiranje bez pretrage
[ bogdan.kecman @ 01.04.2013. 15:10 ] @
tabela student - ne valja. zato i imas te probleme.
[ nezki @ 01.04.2013. 16:33 ] @
Pa teoretski ne postoji mogucnost drugacije.
Ako naprvim na primer mdju tabelu
student_fakultet
i u njoj stavim
id, student_id, fakultet_id

Kako onda na kraju da dobijem iz jednog upita rezultate u formatu
Student_Id, Student Ime, Naziv fakulteta 1, Naziv fakulteta 2, Naziv fakulteta 3

Potrebnomi je da imam sto manje upita prema bazi jer su u realnosti ogromne tabele upitanju, ovo sam samo pojednostavio primer.
[ bogdan.kecman @ 01.04.2013. 16:42 ] @
- uvek moze drugacije
- ucenik, fax1, fax2, fax3 je i 99.999% slucajeva lose resenje, ja za 25 godina radnog staza jos nisam video primer da je takva denormalizacija donela ista dobro na duge staze (podrazumevam da ucenik moze da ima popunjen samo fax1 a da su fax2 i 3 null a ne da je u pitanju sistem gde fax1, fax2 i fax3 uvek determinisu ta tri stanja kao npr "osnovni fax", "gde ide na vezbe iz fizike", "gde ide na vezbe iz masinskih materijala", ako je ovaj drugi slucaj onda nisi dobro predstavio problem)

u svakom slucaju to sto si inicijalno hteo - ne moze drugacije nego sam ti vec rekao, i to mislim da nije samo da ne moze u mysql-u vec ne moze ni u jednom rdbms-u
[ nezki @ 01.04.2013. 17:18 ] @
Jos je gora realna situacije koja izgleda ovako

Student ima minimalno tri fakulteta za koje se vrednosti vuku iz tabele fakultet.

Medjutim klijent ima opciju iz aplikacije da sam dodaje nova polja u tabeli Student, tipa da doda novo polje Fakultet 4, Fakultet 5 koja se takodje popunjavaju iz tabele fakultet.

Sad klijentu je potrebno da ima jdanu preglednu tabelu u alikaciji koja izgleda ovako:
Student_Id, Student Ime, Naziv fakulteta 1, Naziv fakulteta 2, Naziv fakulteta 3, Naziv Fakulteta 4...

I da ima opciju pretrage te tabele po Nazivu fakulteta 1, Nazivu fakulteta 2... Kao i opciju sortiranja po tim poljima.

Zato je cela situacija zakomplikovana. Pa sam ja hteo da cujem savete drugih, kako je najoptimizovanije resiti ovakav sistem da bi aplikacija radila sto brze


[ bogdan.kecman @ 01.04.2013. 17:37 ] @
Citat:
nezki
Student ima minimalno tri fakulteta za koje se vrednosti vuku iz tabele fakultet.
Medjutim klijent ima opciju iz aplikacije da sam dodaje nova polja u tabeli Student, tipa da doda novo polje Fakultet 4, Fakultet 5 koja se takodje popunjavaju iz tabele fakultet.


to se uvek i jedino resava preko cross tabele kako si i sam pokazao

Citat:
nezki:
Sad klijentu je potrebno da ima jdanu preglednu tabelu u alikaciji koja izgleda ovako:
Student_Id, Student Ime, Naziv fakulteta 1, Naziv fakulteta 2, Naziv fakulteta 3, Naziv Fakulteta 4...


pa izgenerisi mu tu tabelu, klijent sigurno ne cuka sql vec ima neku aplikaciju, ta aplikacija treba da izgenerise taj sadrzaj koji je svejedno dinamican (moze da ima i 10 fakulteta za jednog klijenta)

ono sto se cesto koristi ovde je group_concat

select a.student_ime, group_concat(b.fax SEPARATOR ',') from a join b using (student_id) group by a.student_id;

pa onda to polje razbijes na polja na klijentu

Citat:
nezki:
I da ima opciju pretrage te tabele po Nazivu fakulteta 1, Nazivu fakulteta 2... Kao i opciju sortiranja po tim poljima.


tek za to ti je lakse sa cross tabelom

Citat:
nezki:
Zato je cela situacija zakomplikovana.


ne kapiram sta je tu zakomplikovano? pa lakse ti je da radis join i dodas where fax_id=7 i odma radis pretragu kroz svih 10 fakulteta nego da radis where fax1 or fax2 or ... faxn..

[ bogdan.kecman @ 01.04.2013. 17:41 ] @
a btw ako ti je razlitio sta je u fax1 a sta u fax2 samo dodas i redni broj faxa u cross tabelu
[ nezki @ 02.04.2013. 14:19 ] @
Ok. Hvala. Probacu tako