Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wiele do wielu
Forum PHP.pl > Forum > Bazy danych > MySQL
basurman
Używając relację wiele do wielu, np.
ksiazka(idKsiazki primary key, tytul, ...)
autor(idAutora primary key, imie, nazwisko, ...)
autor_ksiazka(idAutora foreign key, idKsiazki foreign key)
jako rozwiązanie problemu:jedna książka -> wielu autorów,
jeden autor -> wiele książek.
Moja baza wymaga (wg mnie) takiej konstrukcji,
a o ile wyszukiwanie wg dowolnego parametru nie sprawia tu żadych
problemów,
to wyświetlenie wszystkich książek wraz z autorami jest chyba niemożliwe
za pomocą jednego zapytania questionmark.gif
A nawet z użyciem kilu zapytań będzie kłopotliwe - jak się to robi questionmark.gif
ZAZNACZAM, ŻE INTERESUJE MNIE ROZWIĄZANIE GDZIE W WYNIKU
ZAPYTANIA DLA KAŻDEJ KSIĄŻKI OTRZYMAM TYLKO JEDEN REKORD


Do tej pory 'załatwiałem' to w ten sposób, że w tabeli dawałem pola typu
enum('Tak', 'Nie') dla kryterium
'zastosowanie' - gdzie jeden model może mieć zarówno jedno, jak i np. 6
różnych zastosowań.
To nawet do pewnego stopnie załatwiało sprawę - x kolumn enum('Tak',
'Nie') o nazwie takiej jak zastosowanie.
Załatwiało do czasu kiedy okazało się, że nie znam pełnej listy
zastosowań, i odkrycie każdego nowego
wiązało by się z modyfikacją struktury bazy
a co za tym idzie - wszystkich skryptów.
gdaq
  1. SELECT autorzy.imie, autorzy.nazwisko, ksiazki.tytul, ksiazki.[ilosc stron]
  2. FROM ksiazki INNER JOIN (autorzy INNER JOIN ksiazk_autor ON autorzy.id_autora = ksiazk_autor.id_autora) ON ksiazki.id_ksiazki = ksiazk_autor.id_ksiazki;
basurman
nie jestem teraz w stanie przetestować twojego zapytania gdaq,
ale o ile pamięć mnie nie myli to w jego wyniku dla książki,
która ma 2 autorów otrzymam 2 rekordy o tym samym egzemplarzu
1. imie1 nazwisko1 tytuł 366
2. imie2 nazwisko2 tytuł 366

niech mnie ktoś poprawi bo częściej używam OUTER JOIN i być może
INNER daje wynik o jaki mi chodzi, czyli coś w rodzaju:

imie1 nazwisko1 imie2 nazwisko2 tytuł 366
gdaq
moja pomylka masz racje dostaniesz dwa rekordy

Gdaq
jerrys
Nie da się wyświetlić n-wierszy (rekordów) w jednym.
smile.gif
basurman
w zasadzie spodziewałem się takiej odpowiedzi
ale problem pozostaje, jak ‘standardowo’ (poprawnie)
pobiera się dane z baz o strukturze wiele do wielu

dwie z możliwości jakie przychodzą mi do głowy to:
I. pobranie wszystkich potrzebnych danych (np. z przykładowej tabeli ksiazka)
a następni dla każdego idKsiazki wyciągnięcie danych o autorze (autorach)
z tabeli autor poprzez tabele autor_ksiazda;
połączenie danych do wyświetlenia za pomoca php
ogromnym minusem tego pomysłu jest liczba zapytań > od liczby wyników (książek)

II. pobranie wszystkich danych jednym zapytaniem - i tu znów duży minus - spora
redundancja danych - dla ksiązki z 3 autorami otrzymam 3 rekordy analogicznie
do tego co napisałem w poście powyżej, gdzie większość danych z 2 rekordów jest
zbędna - dostałem je już w pierwszym rekordzie
także w tym przypadku sporo pracy spada na php przy wyświetlaniu danych

czekam na sugestie
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.