Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niewykonalne zapytanie ?
Forum PHP.pl > Forum > Bazy danych > MySQL
kpax81
Siemanko
Mam male pytanko zwiazane z zapytaniem w mysqlu:)

Storzylem 3 tabele.

Ksiazki ( id_ksiazki int not null auto_increment,
tytul varchar(100));

Autorzy (id_autora int not null auto_increment,
imie varchar(10),
nazwisko varchar(30));

Relacje(id_ksiazki int unsigned not null,
id_autora int unsigned not null);


Ta trzecia tabelka po to jakby ksiazka maiala wiecej niz jedengo
autora.
Np ksiazka pt:"Kubus puchatek" autorzy: "Marcin Cyrankowski"
i "Stefek Burczymucha"

Wpisalem te nazawiska do tabeli auorzy i tytul do tabeli ksiazki a do
tabeli relacje wstawilem dwa rekordy do jednej ksiazki bo dwa nazwiska
np. tak
insert into relacje ('1','1'),('1','2'); pierwsz wartosc to
id_ksiazki druga atorow.

Zeby wyswietlic interesujace mnie informacje o ksiazce uzywam
polecenia:

select tytul,imie,nazwisko from ksiazki,autorzy, relacje where
relacje.id_ksiazki=ksiazki.id_ksiazki and
relacje.id_autora=autorzy.id_autora;
i wszysto ladnie dziala exclamation.gif!!

Problem w tym ze jezeli mam dwoch autorow to te informacje
wyswietlane sa w dwoch rekordach.:
Kubus puchatek --- Marcin Cyrankowski
Kubus puchatek --- Stefek burczymuch i to mi sie wlasnie nie
podoba!!!

Bo robie stronke z ksiazkami i jak wrzuce na stronke kodzik php zeby
pobral informacje na temat ksiazek t owyswietla mi je w tylu
rekordach ilu ksiazka ma autorow exclamation.gif
Jak to zmienic questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif?
Zeby bylo wyswietlone Kubus puchatek -- Marcin
Cyrankowski, Stefek Burczymucha
kszychu
A nie prościej autorów trzymać w jednym polu razem z danymi książki? Przy wyszukiwaniu po autorze możesz wówczas użyć LIKE.
Cienki1980
Cytat(kszychu @ 19.01.2007, 09:55:04 ) *
A nie prościej autorów trzymać w jednym polu razem z danymi książki? Przy wyszukiwaniu po autorze możesz wówczas użyć LIKE.

Chyba nie za bardzo fortunny sposób. Co w przypadku jak chesz wyciągnąc samych autorów i zrobisz zapytanie LIKE %Cyranowski% a w wyniku dostaniesz Cyranowski,Babecki questionmark.gif Dostane dwa nazwiska a chciałem tylko jedno.

@kpax81: przy tak ułożonej bazie danych nie widze możliwego zapytania, żeby otrzymać to czego żądasz.

Jedynie obrobienie danych da taki efekt.
kpax81
To jak inaczej ulozyc to baze ?

Moge poprostu stworzyc dwie table:

ksiazki(id_ksiazki,tytul,id_autora)
autorzy(id_autora,imi,nazwisko)


Jezeli dodam w ten sposob ksiazke insert into ksiazki values('','Tytul ksiazki','Autor1;Autor2); --- program juz mi zwraca ostzrezenie ale ksiazka zostaje dodana.
Ale jak pobieram informacje
select tytul,imie,nazwisko from ksiazki, autorzy where ksiazki.id_autora=autorzy.id_autora to zostaje wyswietlone tylko jedno nazwisko sad.gif

Jest jakis konkretny sposob na zapytanie lub jakis inny sposob zaprojektowania tabel ?

Prosze pomozcie bo juz wymiekam:)
Cienki1980
Nie widze możliwości tak zaprojektowania bazy danych, żeby w jednym wierszu z książką byli wypisani wszyscy autorzy poza sposobem, który pokazał kszychu ale wg mnie ma on też swoje złe strony.
kpax81
MOze byc to co krzychu zaproponowal tylko nie rozumiem co on zaproponowal smile.gif

Moglbys mi poswiecic 5 min ? bo zaraz nerwicy dostane siedze juz nad tym drugi dzien sad.gif to moje gg:5683416

Stworzyc tabele autorzy ( id_autora, imie_nazwisko)
i wstawiac tak dane do autorow : insert into autorzy values('id_autora','MArcin Cyrankowski, Jan Matejko');
questionmark.gif? Wstawiac dwa nazwiska pod jedno id_autora ? To bylo by dobre ale jak sie autor powtorzy w inej ksiazce to bede musial stworzyc dla niego nowe id a to bezsensu:)

O to chodzilo krzyskowi ?
wojtek.zielinski
Cytat(kpax81 @ 19.01.2007, 09:17:13 ) *
select tytul,imie,nazwisko from ksiazki,autorzy, relacje where
relacje.id_ksiazki=ksiazki.id_ksiazki and
relacje.id_autora=autorzy.id_autora; [/b] i wszysto ladnie dziala exclamation.gif!!

Najlepszym rozwiazaniem bedzie chyba takie zapytanie:

  1. SELECT k.tytul, a.autorzy
  2. FROM ksiazki k,
  3. (SELECT r.id_ksiazki, GROUP_CONCAT(CONCAT(a.imie,' ',a.nazwisko) SEPARATOR ', ') AS 'autorzy'
  4. FROM autorzy a, relacje r
  5. GROUP BY r.id_ksiazki) a
  6. WHERE a.id_ksiazki = k.id_ksiazki

Nie jestem pewien co do poprawnosci tego zapytania, ale mam nadzieje, ze chociaz podpowie to tok postepowania.
kpax81
Moze cos z tego bedzie smile.gif
Teraz wszyscy autorzy sa przypisani do kazdej ksiazki:)
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-2024 Invision Power Services, Inc.