Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ilość rekordów przy kilku tabelach łączonych
Forum PHP.pl > Forum > Bazy danych > MySQL
mihmih
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
ciekawa struktura, a jak dojdzie 8 kategoria to dokładasz nową tabelkę?
mihmih
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
a nie lepiej zrobić jedna tabelkę z kategoriami i jedną z cechami i jedną łączącą cechy z kategoriami?
trueblue
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
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
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
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
Na warunek WHERE nie ma miejsca, ale jest na IF smile.gif
mihmih
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
Tak, ale IF będzie bardziej kompaktowe w tym przypadku.
GROUP_CONCAT(IF(ID_kategorii=1,zdolnosc,NULL) SEPARATOR ', ')
mihmih
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.