mihmih
2.12.2016, 19:56:56
witam,
przepraszam że będzie opisowo, ale dane mam w pracy i nie mam przy sobie żadnego kodu.
Mam tabelę z opisem pewnego egzaminu, podczas którego można zdobyć różne zdolności w różnych kategoriach. Kategorii jest 7, w każdej kategorii jest od 2 do 7 zdolności, które można zdobyć podczas egzaminu. A więc mam 7 tabel z kategoriami zdolności i 7 tabel łączonych np. (ID, ID_kategorii1, ID_egzaminu).
Wprowadziłem pierwszy egzamin, gdzie osoba zdobyła w pierwszej kategorii 2 zdolności,w kolejnych było: 2-1, 3-1, 4-2, 5-7, 6-2, 7-2. Tabele są połączone jednostronnie, po stronie egzaminu. (left outer join). I spodziwałem się 1 rekordu, bo mam tylko jeden egzamin, do którego mają się dostosować pozostałe tabele, ale wychodzi mi tych kolumn 112 (2x1x1x2x7x2x2). Czy tak powinno być? Bo myślę już nad tym tyle godzin i jjuż jestem skołowany.
javafxdev
2.12.2016, 20:02:50
ciekawa struktura, a jak dojdzie 8 kategoria to dokładasz nową tabelkę?
mihmih
2.12.2016, 20:09:33
wtedy musiałbym dołożyć dwie: z charakterystykami 8 kategorii i łącząca ta tabelę z tabelą egzaminu. Ale tak się nie zdarzy, mogą jedynie dochodzić nowe zdolności w tych 7 kategoriach, a z tym nie będzie problemu, bo będę wtedy uzupełniał tabele o nowy rekord.
javafxdev
2.12.2016, 20:12:21
a nie lepiej zrobić jedna tabelkę z kategoriami i jedną z cechami i jedną łączącą cechy z kategoriami?
trueblue
2.12.2016, 20:24:39
Jest to efekt tzw. pośredniego cross join. Tabele z kategoriami nie wiedzą w jakiej relacji są między sobą.
Najłatwiej sobie wyobrazić skąd ten efekt, ustawiając tabelę z egzaminem w środku, a tabele z kategoriami w formie gwiazdy (wokół).
mihmih
2.12.2016, 20:35:40
więc chyba jednak lepiej zrobić jedną tabelę ze zdolnościami z dodatkową kolumną określającą jaka to kategoria i jedną tabele łącząca, gdzie będzie ID egzaminu i ID zdolności tak?
trueblue
2.12.2016, 20:39:58
To jest pewne.
Natomiast w ramach zabawy możesz spróbować tak: połączyć LEFT JOIN tabelę egzamin z UNION wszystkich tabel kategorii (jako jedna tabela).
mihmih
2.12.2016, 20:48:01
ok, dzięki, jutro będę się bawił.
Jeszcze jedna sprawa - wcześniej w tym moim dziwnym schemacie miałem w tabelce wymienione uzyskane zdolności, wszystkie po przecinku, kązda kategoria w osobnej kolumnie. Uzyskałem to dzięki group_concat. Ale teraz jak zrobię group_concat to wrzuci mi wszystkie zdolności do jednej kolumny chyba....bo w group concat nie ma miejsca chyba na warunek where? A group by na końcu jeśli zrobię wg ID_kategorii to nie będę miał listy egzaminów tak jak chciałem....
trueblue
2.12.2016, 20:50:00
Na warunek WHERE nie ma miejsca, ale jest na IF
mihmih
2.12.2016, 20:55:54
if nigdy nie używałem....robi to samo co CASE WHEN?
group_concat(case when ID_kategorii = 1 then zdolnosc else null end separator ', ')
takie coś będzie? Mam nadzieję że nie będę miał tam kilkunastu przecinków obok siebie, jeśli większość zdolności zastąpi null?
trueblue
2.12.2016, 21:03:13
Tak, ale IF będzie bardziej kompaktowe w tym przypadku.
GROUP_CONCAT(IF(ID_kategorii=1,zdolnosc,NULL) SEPARATOR ', ')
mihmih
2.12.2016, 21:13:57
ok, jeszcze raz dzięki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.