Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Projekt bazy książek
Forum PHP.pl > Forum > Bazy danych > MySQL
AgEnT
Witam
Szukam książek lub stron poświęconych zagadnieniu projektowania bazy danych. z góry dzięki za odpowiedź.
Na swojej stronie (www.conan.fero.pl) mam zamiar zbudować bazę książek o Conanie. Chce żeby można było wyświetlać wyniki po tytule, autorze, tłumaczu, opowiadaniu itp. coś podobnego do bazy na stronie http://f-sf.org/elementarz/cykle.php?idCyk...r=C&level=2 ale ma problem taki że baza jest dość zaawansowana i nie wiem czy zamieścić wszystko w jednej tabeli czy jakoś rozbić że w jednej autorzy, wydawnictwa i potem połączyć to kluczami.

Baza będzie zawierać dane:
--------------------------------
tytuł oryginalny
tytuł polski
isbn
autor(autorzy)
seria
wydawnictwo
rok wydania
tłumacz
stron
wydanie
okładka
wymiary(mm)

Myślałem żeby zrobić to w kilku oddzielnych tabelach:
- ksiazki
- autorzy
- wydawnictwa
- seria

Tylko jak dana książka będzie mieć kilku autorów to czy w tabeli książki wpisywać w kolumnie id_autora (1;3;6) potem to przy odczycie wpisywać do tablicy rozbijać i wyszukiwać z tabeli autorzy? Właśnie z tym mam problem i potrzebuje pomocy.
Z góry dzięki za wszelkie uwagi jak dobrze taka bazę zaprojektować.
nospor
W przypadku, gdy dana ksiązka może wmiec wielu autorów, i autor moze m,iec wiele ksiazek, mysle ze dobrym rozwiązaniem bylaby tabela laczace te dei ze sobą, czyli:
Cytat
tabela: ksiazka_autor
pola:
- id_ksiazki
- id_autora
AgEnT
tabela ksiazki
--------------
id_ksi | tytuł|

tabela autorzy
--------------
id_aut | nazwa|

tabela ksiazka_autor
--------------------
id_ksi | id_aut

dane tabela ksiazka_autor:

1 | 1
1 | 3
2 | 4
3 | 1
3 | 6

----------------------------------
Moje pytanie jak skonstruować zapytanie żeby wyświetlić wszystkich autorów danej książki ?
nospor
  1. <?php
  2.  
  3. $idKsiazki='twojeid';
  4. $sql='select a.* from autorzy a, ksiazka_autor ka where ka.id_ksi = '.$idKsiazki.' and a.id_aut=ka.id_aut';
  5.  
  6. ?>


pozdro
AgEnT
dzieki za pomoc nospor - oczywiscie zapytanie działa

Teraz mam jeszcze inne pytanie smile.gif Książki mają różną kategorię i chciałem stworzyć liste kategorii ze zliczonymi pozycjami z każdej kategorii np.

Horror 5
Fantasy 8
Sensacja 3

Jak w jednym zapytaniu wyodrębnić wszystkie kategorie i sume książek jakie sie w nich znajdują?
nospor
nie wiem jaką masz nową strukturę . zakladam ze cos takiego:
tabela ksiazki
--------------
id_ksi | tytuł| id_kat

tabela kategorie
id_kat | nazwa

zapytanie:
  1. SELECT count(ks.id), kat.nazwa
  2. FROM ksiazki ks, kategorie kat WHERE ks.id_kat=kat.id_kat GROUP BY ks.id_kat


edit: mala poprawke zrobilem
AgEnT
Wielkie dzieki oczywiście działa bez problemu smile.gif

Teraz pojawił sie problem przy dodawaniu nowej książki pole id_ksiazki jest auto_increment.

Dodawanie nowej ksiazki polega na wpisaniu tytułu w polu <input> i wybraniu autora(ów) książki (klikniecie na 'checkbox') potem wyślij i ma mi sie tytuł dodać do bazy ksiazki a do tabeli powiazań ma zostać wpisany id_ksiazki i id_autora (ewentualnie kilku) więc przy polu id_ksiazki nie moge dać null zeby mi sam wpisał kolejna wartość tylko chciałbym pobrac ostatnią wartość z bazy z pola id_ksiażki i sam dodać 1 i wpisac to do bazy ksiazki i odrazu do bazy powiazań. Nie wiem czy jasno to opisałem smile.gif i ktoś mnie zrozumie. W każdym razie chodzi mi o to jak najprościej pobrac ostatnią wartość pola id_ksiazki.

tabela ksiazki
id_ksiazki | nazwa

tabela autorzy
id_autora | nazwa

tabela powiazań
id_ksi | id_autora
nospor
hihi. robisz nowa ksiaązkie, czyli dajesz insert z null. potem pobierasz ostatnio dodany id i masz id ksiązki.
http://forum.php.pl/index.php?showtopic=30312&hl=last

pozdro
AgEnT
Cytat(nospor @ 2005-06-30 09:23:39)
zapytanie:
  1. SELECT count(ks.id), kat.nazwa
  2.  
  3. FROM ksiazki ks, kategorie kat WHERE ks.id_kat=kat.id_kat GROUP BY ks.id_kat

nospor jak zawsze Twoje odpowiedzi w 100% trafne.

Co do wcześniejszego zapytania to można by dorzucić funkcję która oprócz wypisania tych kategorii z liczba książek dawała by mi jeszcze sume wszystkich pozycji w bazie.
nospor
hmmm...
raczej się nie da.

chcesz miec liczbe rekordów w tabeli to:
  1. SELECT count(*)
  2. FROM ksiazki

lub jak wykonasz to wczesniejsze zapytanie z liczbą ksiązek w kategorii to se zsumujesz w php i bedziesz mial sume.

pozdro
AgEnT
Cytat(nospor @ 2005-07-01 07:42:44)
lub jak wykonasz to wczesniejsze zapytanie z liczbą ksiązek w kategorii to se zsumujesz w php i bedziesz mial sume.

Dokładnie tak zrobiłem sumowałem pobrane zmienne. dzieki

Jeszcze jedno pytanie do zapytania:
  1. SELECT count(ks.id), kat.nazwa
  2. FROM ksiazki ks, kategorie kat WHERE ks.id_kat=kat.id_kat GROUP BY ks.id_kat


Mam baze leksykon z roznymi haslami:
id_has | haslo | opis | itp

Czy dało by sie przerobić te zapytanie tak żeby wypisać sumy haseł zaczynające sie na dana literę. np. A (3) | B (12) | C (1) itd...
basurman
z tego co mi wiadomo nie da się uzyskać zakładanego przez Ciebie wyniku jednym zapytaniem,
musisz użyć operatora LIKE aby wyszukiwać po pierwszej literze hasła;
dla każdej litery trzeba wykonać zapytanie typu:

  1. SELECT count(id_has)
  2. FROM leksykon WHERE haslo LIKE "A%";


poniżej przykładowy kod php wykorzystujący to zapytanie:

  1. <?php
  2. $tab = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L');
  3. for($i=0; $i<count($tab); $i++)
  4. {
  5. $result = mysql_query('select count(id_has) from leksykon where haslo like \"'.$tab[$i].'%\"');
  6. $ile = mysql_fetch_row($result);
  7. echo $tab[$i].' ('.$ile[0].') &nbsp;';
  8. }
  9. ?>


możliwe, że istnieje bardziej błyskotliwy sposób uzyskania tego wyniku,
ale ja na niego nie wpadłem
nospor
Da się winksmiley.jpg
  1. SELECT LEFT(haslo,1) h,count(haslo)
  2. FROM leksykon GROUP BY h

edit: jak edytujesz ostatni post, nie pokazuje ze jest cos nowego. Dlatego dopiero teraz dojrzalem że masz nowe pytanko. Najlepiej ususwaj ostatni post a w jego miejsce wstaw nowy ze starą trescią + nowa tresc.
AgEnT
  1. DELETE
  2. FROM baza WHERE id_aut=22


Przy takim zapytaniu jak się można dowiedzieć ile rekordów zostało z tablicy usuniete?
nospor
Przed zadaniem tego typu zapytań dobrze jest zajrzeć do manuala:
Cytat
Przyjmując, że zapytanie się powiodło, można użyć mysql_num_rows() by uzyskać informację o liczbie wierszy zwróconych w instrukcji SELECT, lub mysql_affected_rows() w celu uzyskania liczby wierszy przetworzonych przez instrukcje DELETE, INSERT, REPLACE i UPDATE.
SongoQ
Cytat(nospor @ 2005-07-18 09:09:01)
Przed zadaniem tego typu zapytań dobrze jest zajrzeć do manuala:
Cytat
Przyjmując, że zapytanie się powiodło, można użyć mysql_num_rows() by uzyskać informację o liczbie wierszy zwróconych w instrukcji SELECT, lub mysql_affected_rows() w celu uzyskania liczby wierszy przetworzonych przez instrukcje DELETE, INSERT, REPLACE i UPDATE.

Wspaniala uwaga, a do tego jeszcze wykorzystac transakcje i w ogole jest ok. Jesli cos usuwamy sprawdzamy ile rekordow to dotyczylo i jesli oczekujemy np 1 rekordu sprawdzamy czy jest rowne jesli tak to zatwierdzamy a jesli nie to cofiemy i pokazujemy komunikat bledu.

Czy ktos ma jakies pomysly ktore moga bardziej dane zabezpieczyc?
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.