Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Połączenie 3 tabel
Forum PHP.pl > Forum > Przedszkole
HeemEn
Witam!

Mam problem z połączeniem 3 tabel w mysql. Napisałem sobie prosty formularz, którym dodaję do bazy moje prace. W pierwszym za pomocą <select> wybieram sobie kategorie, 2 pole to tytuł, 3 opis, natomiast pola 4, 5 i 6 to pola wyboru, z których wybieram wcześniej zuploadowane zdjęcia. Wszystko pięknie dodaje do bazy i jest ok. Problem natomiast pojawia się w momencie, kiedy chcę wyświetlić dane.

Kod wygląda tak:
  1. <?php
  2. require_once "../core.php";
  3.  
  4. echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
  5. <html xmlns='http://www.w3.org/1999/xhtml'>
  6. <head>
  7. <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
  8. <title>Wyświetl rekordy</title>
  9. </head>
  10.  
  11. <body>\n";
  12.  
  13. $result = mysql_query(
  14. "SELECT tw.*, twc.*, twp.* FROM work tw
  15. LEFT JOIN cats twc ON tw.work_cat=twc.cat_id
  16. RIGHT JOIN photos twp ON twp.photo_file=tw.work_photo1
  17. AND twp.photo_file=tw.work_photo2
  18. AND twp.photo_file=tw.work_photo3
  19. LIMIT 0,1"
  20. );
  21.  
  22. if (mysql_num_rows($result)) {
  23. while ($data = mysql_fetch_assoc($result)) {
  24. echo "<h3>".$data['work_title']."</h3>\n";
  25. echo "<p>".$data['cat_name']."</p>\n";
  26. echo "<p>".$data['work_desc']."</p>\n";
  27. echo "<a href='images/".$data['photo_file']."'><img src='images/mini/".$data['photo_file']."' alt='' /></a>\n";
  28. echo "<a href='images/".$data['photo_file']."'><img src='images/mini/".$data['photo_file']."' alt='' /></a>\n";
  29. echo "<a href='images/".$data['photo_file']."'><img src='images/mini/".$data['photo_file']."' alt='' /></a>\n";
  30. }
  31. }
  32.  
  33. echo "</body>
  34. </html>";
  35.  
  36. ?>


Wiem, że konstrukcja wyboru tabel jest zła bo tam już kombinowałem na chybił trafił. W tej chwili wygląda to tak:


Chciałbym, żeby wyświetlany tył wybrany tytuł pracy, kategoria, do której owa praca została dodana, opis pracy i 3 zdjęcia pracy.

Bardzo proszę o pomoc

Pozdrawiam serdecznie
darko
Podałbyś jeszcze pełną strukturę bazy to byłoby łatwiej coś poradzić, jeśli możesz ruszyć istniejącą strukturę, to proponuję:

tabela category
id_category
category_name
category_status

tabela foto
id_foto
id_task
foto_name
foto_path
foto_status

tabela task
id_task
id_category
task_title
task_description
task_status

Dla powyższej (zupełnie przykładowej) struktury:

1. wyci ągnięcie wszystkich aktywnych kategorii np. do selecta: select id_category, category_name from category where category_status=1 umożliwia wybór kategorii (np. z selectora, w selektorze pokazujesz tylko nazwy kategorii, natomiast można dać przekierowanie na zdarzenie onchange, tak żeby po wyborze z selectora przekierować do skryptu z właściwym id_category)
2. kategoria, do której owa praca została dodana - to łatwe, bo jeśli już po przekierowaniu dysponujesz id_category, to nie problem po id_category wyciągnąć category_name
3. wybór prac w danej kategorii: mamy już wybrane poprzednio id_category, więc: select id_task, task_title from task where id_category=X and task_status=1
4. wyświetlenie tytułu pracy - mamy wybrane id_task, więc: select task_title from task where id_task=Y
5. opis pracy: select task_description from task where id_task=Y
6. i 3 zdjęcia pracy: select foto_name, foto_path from foto where id_task=Y and foto_status=1

ps. wszystkie pola abc_status to tnyint(1) - przyjmują wartość logiczną 0 lub 1 i pozwalają zarządzać statusami rekordów w bazie (decyzja czy coś jest dostępne czy nie)
HeemEn
Baza wygląda tak:

tabela cats
cat_id
cat_name

tabela photos
photo_id
photo_file

tabela work
work_id
work_cat
work_title
work_desc
work_photo1
work_photo2
work_photo3
darko
no to ok dodaj tylko jeden klucz work_id do tabeli photos i problem z głowy, dane wyciągaj po kluczach obcych (InnoDB) wszystko na ten temat
HeemEn
Hmm nie bardzo wiem o co chodzi. smile.gif Dało by się to jakoś łopatologicznie wyłożyć? smile.gif
marcio
Poczytaj troche o relacjach pomiedzy tabelami za pomoca kluczy obcych i do tego o kilku mozliwosciach laczenia tabel za pomoca sql LEFT JOIN/RIGHT JOIN/INNER JOIN etc...
HeemEn
Kombinuję, kombinuję i nadal mi nie wychodzi... sad.gif
darko
jeśli do tabeli photos dodasz klucz obcy (foreign key) z tabeli work czyli klucz podstawowy tabeli work, będziesz mógł wtedy wyciągnąć dowolną ilość zdjęć przypisaną do danej pracy (do tabeli work):

tabela photos
photo_id
work_id
photo_file


select photo_file from photo where work_id = X, gdzie X to wartość klucza z tabeli work - prosta relacja, zresztą w ten sam sposób wyciągasz już dany work z określonej kategorii, sytuacja jest analogiczna.
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.