Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Rekordy z dwóch tabel w jednej funkcji
Forum PHP.pl > Forum > Przedszkole
Bellum
Witam otóż posiadam FORUM IBP3.
Dążę do tego by stworzyć stronę główną, która to zawiera menu z odpowiednimi subkategoriami z forum => każda subkategoria zawiera w sobie odpowiednio związane z nią tematy a więc jest aktywnym odnośnikiem => gdzie po kliknięciu wyświetla się lista tematów z danej kategorii; a że raczkuję w PHP być może nawet się czołgam, to proszę o porady.


  1. $mysql = "SELECT pid,post FROM posts WHERE topic_id IN(7)";
  2. $wykonaj = @mysql_query($mysql) or die('<br />Niepoprawny wiersz bądź kolumna<br />'.mysql_error());
  3. echo '<DIV ID="MENU"><dl id="menu0">';
  4. while ($wiersz = mysql_fetch_row($wykonaj))
  5. {
  6. echo '<dt>'. $wiersz[0] .'</dt><dd>'. $wiersz[1] .'</dd>';
  7. }
  8. echo '</dl></DIV>';


Funkcja wyświetla PID oraz POST, który sobie wybrałem, natomiast chciałbym by zamiast PID wyświetlany był odpowiedni tytuł danego postu, lecz znajduje się on w innej tabeli TOPICS => TITLE; Ja natomiast nie wiem w jaki sposób wyświetlić dane z dwóch tabel w jednej funkcji - to moje pytanie.

Pozdrawiam serdecznie
athei
http://www.google.com/search?q=mysql+join
Bellum
Cytat(athei @ 2.03.2010, 22:43:22 ) *

Uwierz mi, że szukam rozwiązania od dobrych paru godzin JOIN znalazłem już z początku, mam jednak z tym parametrem problem:

  1. $mysql = "SELECT pid,post FROM posts WHERE topic_id IN(7) LEFT JOIN name FROM forums";


Powyżej funkcja, której próbowałem na początku, poniżej jej efekt:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN name FROM forums' at line 1

Jakieś rady?
thek
Bo tak się nie łączy tabel. Tabele łączy się od razu za FROM a jeszcze przed WHERE (no chyba, że łączymy je pisząc odpowiedni WHERE winksmiley.jpg ). Pooglądaj przykłady z użycia JOIN różnych to na pewno złapiesz jak składnia ma wyglądać. Najlepiej poczytaj jakiś podstawowy, prosty kurs SQL netowy, a powinieneś zrozumieć to dość szybko. Myślę, że wpisanie w google frazy: sql kurs join wyświetli Ci wiele przydatnych materiałów poglądowych :)Na szybko wybrałem kilka przykładów JOIN z manuala byś obejrzał:
  1. SELECT * FROM table1, table2;
  2. SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id;
  3. SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
  4. SELECT * FROM table1 LEFT JOIN table2 USING (id);
  5. SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;
Bellum
Cytat(thek @ 2.03.2010, 23:14:49 ) *
Bo tak się nie łączy tabel. Tabele łączy się od razu za FROM a jeszcze przed WHERE (no chyba, że łączymy je pisząc odpowiedni WHERE winksmiley.jpg ). Pooglądaj przykłady z użycia JOIN różnych to na pewno złapiesz jak składnia ma wyglądać. Najlepiej poczytaj jakiś podstawowy, prosty kurs SQL netowy, a powinieneś zrozumieć to dość szybko. Myślę, że wpisanie w google frazy: sql kurs join wyświetli Ci wiele przydatnych materiałów poglądowych smile.gif

Cóż ja wypłynąłem na głębsze wody kupując PHP i MySQL. Tworzenie stron WWW. Vademecum profesjonalisty PHP 5, równie dobrze mogłem zacząć kurs czarnej magii. Wysilę jeszcze aktywne mięśnie by usiedzieć i rozwiązać ten problem a jak się nie uda, to powrócę winksmiley.jpg .

Pozdrawiam


  1. SELECT * FROM table1, table2;


Racja, robiłem tak tyle że nie stawiałem wtedy przecinka..., no ale skoro ładnie działa, to na laurach nie spoczywam.
Dzięki.
thek
Skoro kupiłeś tę książkę, to wspomagaj się nią. Pooglądaj przykłady z niej, przerabiaj i sprawdzaj co powodują zmiany. Książka jest OK. Ma pewne błędy i zapewne errata będzie nieodzowna do ściągnięcia. Jednak najszybciej człowiek uczy się na własnych błędach. Za jakiś czas zapewne nabierzesz doświadczenia i być może sam błędy w książkach zaczniesz zauważać. Czego Ci szczerze życzę.
Bellum
Cytat(thek @ 2.03.2010, 23:53:20 ) *
Skoro kupiłeś tę książkę, to wspomagaj się nią. Pooglądaj przykłady z niej, przerabiaj i sprawdzaj co powodują zmiany. Książka jest OK. Ma pewne błędy i zapewne errata będzie nieodzowna do ściągnięcia. Jednak najszybciej człowiek uczy się na własnych błędach. Za jakiś czas zapewne nabierzesz doświadczenia i być może sam błędy w książkach zaczniesz zauważać. Czego Ci szczerze życzę.

Nie rozpisując się powiem krótko i równie szczerze dziękuję.

Przebrnąłem przez regulamin i nie widzę punktu, który mówiłby inny problem nowy temat a problem mam.
Funkcja działa ślicznie cacy, jednak mam tego typu problem, że nie wiem nawet jak do tego się zabrać, przeszukuję forum i być może trafię na jakiś trop; niestety jak tu na coś trafić gdy nie wiem czego tak na prawdę szukam.

Czego oczekuję: funkcji, która wyświetla POSTY i TYTUŁY z odpowiedniego działu.
Co już mam: Wyświetlanie samych TYTUŁÓW tematów z odpowiedniej kategorii na przykładzie:
  1. $mysql = "SELECT title FROM topics WHERE forum_id IN(7) ";

Czego nie wiem: W jaki sposób wyświetlić, to czego oczekuję?

  1. $mysql = "SELECT title,post FROM posts, topics WHERE forum_id IN(7) ";

Taki kod wyświetla wszystkie tytuły z odpowiedniej kategorii lecz i wszystkie posty ze wszystkich kategorii (robi się dziwny miszmasz). Nie wiem jak się do tego zabrać i od czego zacząć.
thek
Ponieważ powinieneś połączyć te posty z tematami, ale w warunku nie określasz, że posty mają być tylko z tych tematów już ograniczonych. Najlepiej jest połączyć posty z tematami po polu łaczącym i w warunku dodać, że interesują Cię tylko rekordy, gdzie kategoria ma określoną wartośc. To już się realizuje nie łaczeniem tabel poprzez przecinek, ale używając ON i wskazując po czym łączysz obie tabele.
A więc:
  1. SELECT t.title, p.post FROM posts p JOIN topics t ON p.title_id = t.id WHERE t.forum_id IN (7)
Zwróć uwagę na stosowanie aliasów (p oraz t). Używam ich by odróżnić kolumny w obu tabelach. W obu bowiem na bank jest kolumna ID i bez tego baza nie wiedziała by które id używam do łączenia. Przez alias wie, że t.id to id w tabeli topics, a dodatkowo, że forum_id ma wyszukać także w tej tabeli. Zaś pola ma z określonych tabel także wybierać poprzez sprawdzenie aliasu. Poza tym polecam Ci sprawdzić co powoduje użycie zamiast JOIN także LEFT JOIN oraz RIGHT JOIN. Myślę, że może Cię to zaciekawić.
Bellum
Cytat(thek @ 3.03.2010, 09:28:36 ) *
Ponieważ powinieneś połączyć te posty z tematami, ale w warunku nie określasz, że posty mają być tylko z tych tematów już ograniczonych. Najlepiej jest połączyć posty z tematami po polu łaczącym i w warunku dodać, że interesują Cię tylko rekordy, gdzie kategoria ma określoną wartośc. To już się realizuje nie łaczeniem tabel poprzez przecinek, ale używając ON i wskazując po czym łączysz obie tabele.
A więc:
  1. SELECT t.title, p.post FROM posts p JOIN topics t ON p.title_id = t.id WHERE t.forum_id IN (7)
Zwróć uwagę na stosowanie aliasów (p oraz t). Używam ich by odróżnić kolumny w obu tabelach. W obu bowiem na bank jest kolumna ID i bez tego baza nie wiedziała by które id używam do łączenia. Przez alias wie, że t.id to id w tabeli topics, a dodatkowo, że forum_id ma wyszukać także w tej tabeli. Zaś pola ma z określonych tabel także wybierać poprzez sprawdzenie aliasu. Poza tym polecam Ci sprawdzić co powoduje użycie zamiast JOIN także LEFT JOIN oraz RIGHT JOIN. Myślę, że może Cię to zaciekawić.

Dzięki! działa perfekcyjnie poza szczegółami:
W tabeli posts nie ma czegoś takiego jak title_id jest topic_id a w topics nie ma id tylko tid

W rezultacie poprawnie działający skrypt wygląda tak:
  1. SELECT t.title, p.post FROM posts p JOIN topics t ON p.topic_id = t.tid WHERE t.forum_id IN (11)

Z 20 minut się głowiłem o co w tym kodzie w ogóle chodzi, racją jest, że bliższe zapoznanie się z php nie jest wcale takie trudne, może i jest frustrujące ale efekty mniam.

Opóźniły mnie problemy z serwerem o ładne dwa tygodnie. Wracając do meritum, owe moje głowienie trapiło czy przypadkiem tytuły się nie powtarzają, wyświetlałem listę nazw tytułów gdyż nie zauważyłem 2x wierszy[0] co oczywiście dawało podwójny efekt nazw tytułów; po usunięciu tego błędu, wszystko wróciło do normy jednak, nadal niektóre tytuły się powtarzały a jasne przecież jak słońce jest, że tematy zawierały również odpowiedzi użytkowników! i co naturalne w tym przypadku będzie wyświetlanie ich postów; tak już jest jak szuka się dziury w szczegółach a każda treść pod tym samym tytułem się różniła laugh.gif.

Dlatego mam do ciebie kolejne pytanie thek oraz do innych jaki parametr dodać do skryptu by wyświetlało tylko pierwsze posty z tematów.


EDIT:

Poradziłem sobie samodzielnie:
  1. SELECT t.title, p.post FROM posts p JOIN topics t ON p.topic_id = t.tid WHERE t.forum_id IN (11) AND p.author_id IN (2)
Jest też drugi sposób new_topic
  1. SELECT t.title, p.post FROM posts p JOIN topics t ON p.topic_id = t.tid WHERE t.forum_id IN (11) AND p.new_topic IN (1)
Działa poprawnie i nie występują problemy w obu przypadkach.
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.