Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] Optymalizacja zapytania, Wyświetlanie wielu wyników z zapytania jako jeden
sadistic_son
post
Post #1





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Witam,

Mam 5 tabel:
(IMG:http://img9.imageshack.us/img9/1790/relt.jpg)

Stworzyłem zapytanie:
  1. SELECT t_book.id_book, t_book.title, t_book.second_title, t_book.publisher, t_book.date_published, t_book.isbn, t_book.pages, t_book.format, t_book.for_adult, t_book.price, t_book.review, t_book.picture, t_book_author.id_book_author, t_book_author.f_book, t_book_author.f_author, t_author.id_author, t_author.name, t_author.second_name, t_author.surname, t_author.nationality, t_author.opinion, t_author.id_author, t_author.name, t_author.second_name, t_author.surname, t_author.nationality, t_author.opinion, t_title.id_title, t_title.title, t_author_title.id_author_title, t_author_title.f_author, t_author_title.f_title
  2. FROM t_book, t_book_author, t_author, t_author_title, t_title
  3. WHERE t_author_title.f_author = t_author.id_author
  4. AND t_author_title.f_title = t_title.id_title
  5. AND t_book_author.f_book = t_book.id_book
  6. AND t_book_author.f_author = t_author.id_author

Ale jest ono niekompletne bo wyniki wyglądają następująco:
Kod
1 | tytul1 | tytul2 | wydawn1 | 2009 | isbn1 | 412 | 2x5 | 0 | 12 | fajna dosc | c:/ | 1 | 1 | 1 | 1 | zenon1 | zbigniew2 | kowal | polak | znany jest | 1 | zenon1 | zbigniew2 | kowal | polak | znany jest | 2 | mgr | 1 | 1 | 2 |

1 | tytul1 | tytul2 | wydawn1 | 2009 | isbn1 | 412 | 2x5 | 0 | 12 | fajna dosc | c:/ | 1 | 1 | 1 | 1 | zenon1 | zbigniew2 | kowal | polak | znany jest | 1 | zenon1 | zbigniew2 | kowal | polak | znany jest | 1 | inz | 2 | 1 | 1 |

1 | tytul1 | tytul2 | wydawn1 | 2009 | isbn1 | 412 | 2x5 | 0 | 12 | fajna dosc | c:/ | 2 | 1 | 2 | 2 | janek1 | alek2 | sypniewski | polak | znany jest tez | 2 | janek1 | alek2 | sypniewski | polak | znany jest tez | 3 | dr | 4 | 2 | 3 |

2 | tytul2 | tytul3 | wydaw22n1 | 2109 | isbn133 | 4120 | 2x52 | 1 | 122 | f11ajna dosc | c:dwukropek | 3 | 2 | 3 | 3 | janek222 | alek3333 | sypn4444 | pola555k | znan555555y jest tez | 3 | janek222 | alek3333 | sypn4444 | pola555k | znan555555y jest tez | 0 | brak | 6 | 3 | 0 |


Czyli książka pierwsza ma 2 autorów z których jeden ma 1 tytuł a drugi ma 2 tytuły. Przez co książka o id=1 jest powtórzona 3 razy.
Jak powinno wyglądać zapytanie aby w wyniku książka pojawiała się tylko raz a jedynie autorzy z przydzielonymi do nich tytułami byli wyświetlani tyle razy ilu ich jest?

Ten post edytował sadistic_son 12.12.2009, 01:30:52
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Wcale nie wyklucza. Wystarczy, że w tabeli umieścisz je jako jedną z możliwości. Mgr, mgr inż. i inż to były by 3 osobne warianty. Dlatego pisałem o kombinacjach tytułów. Ich naprawdę nie ma aż tyle, by rozbijać to na kilka tabel i potem jeszcze je JOINować. Tylko niepotrzebnie dokładasz złączenie w zapytaniu. t_title i t_author_title śmiało mogą być jedną tabelą i w takim wypadku zmieni Ci się relacja na poziomie t_author i t_author_title. A wyszukiwanie zmieni ci się niewiele. Dlaczego niewiele? Bo tylko o tyle, że będziesz musiał znać przy szukaniu inżyniera gdzie jest inż, mgr inż, dr inż, prof. dr hab. inż. i tego typu. To samo z innymi tytułami. Wyszukiwanie więc będzie nie po jednym id określającym tytuł (WHERE id=1), ale kilku (WHERE id IN (1,4,5,6) ). Całość grupowana jest oczywiście po id książki, ale GROUP_CONCAT na autorach to przecież w takim wypadku już nie problem chyba (IMG:style_emoticons/default/winksmiley.jpg)

EDIT: Poprawka literówek. Nienawidzę pisania z kompa dziewczyny. Połowę klawiszy muszę walić chyba młotkiem bo nie reagują. Nawet spacja działa ze skutecznością 50% :/

Ten post edytował thek 12.12.2009, 10:55:46
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 07:36