Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Porównanie z dwóch tabel z wyciągnięciem danych
Forum PHP.pl > Forum > Bazy danych
Max Damage
Mam tabele forum i user. W tabeli forum mam mn. kolumnę autor, a w tabeli user mn. kolumny nick i user_id.
Teraz taki oto kod:
  1. <?php
  2. $zapytanie="select * from forum where id_artykulu='$id_artykulu'";
  3. $wynik = $lacz->query($zapytanie);
  4. $wiadomosc=$wynik->fetch_array();
  5. $zapytanie2="select user.user_id from user where forum.autor=user.nick";
  6. $wynik2=$lacz->query(zapytanie2);
  7. $wiadomosc2=$wynik2->fetch_array();
  8. echo $wiadomosc['temat'];
  9. echo '<br/>';
  10. echo "<a href='profil.php?id=".$wiadomosc2['user_id']."'>".$wiadomosc['autor']."</a>"; 
  11. echo '<br/>';
  12. echo $wiadomosc['wiadomosc'];
  13. echo '<br/>';
  14. echo date ('M d,H:i',$wiadomosc['umieszczony']);
  15. echo '<br/>';
  16. echo "<a href='odpowiedz.php?id=".$wiadomosc['id_artykulu']."'>Odpowiedz</a>"; 
  17. echo '<br/>';
  18. ?>

Pierwsze zapytanie działa bez problemu, chodzi mi natomiast o drugie w którym chcę wyciągnąć user_id kolesia którego nick widnieje w kolumnie autor. Próbowałem w tym celu porównać autora z nickiem, ale spełzło na niczym :/
Mam nadzieje, że nie zagmatwałem tego za bardzo i wiadomo o co chodzi....
Dobrze by też było jak by mi ktoś chociaż powiedział czy te 2 zapytania da się połączyć w jedno, chociaż najpierw wolałbym aby to w ogóle działało jak trzeba....
AxZx
moze daj strukture tych 2 tabel,
porownanie tresci jest wiekszym obciazeniem niz porownanie liczb,
wiec lepiej jakbys szukal forum.autor_id = wiadomosc.autor_id

nie wiem jaka masz strukture i jak masz baze zaprojektowana, ale cos tu nie gra, napewno da sie to uproscic i zoptymalizowac.
Max Damage
Ok, to są kody tworzące moją bazę:
  1. $sql="create table user
  2. (
  3. user_id int unsigned not null auto_increment primary key,
  4. nick varchar(16) not null,
  5. haslo char(30) not null,
  6. email varchar(100) not null)";
  7.  
  8. $sql="create table forum
  9. (
  10. id_artykulu int unsigned not null auto_increment primary key,
  11. temat char(20) not null,
  12. wiadomosc text,
  13. autor char(16) not null,
  14. umieszczony int not null)";
AxZx
autor to moze byc user_id ?
zmien typ na int

jak juz to zrobisz to wyciagniecie wiadomosci robisz z uzyciem join

  1. SELECT * FROM user LEFT JOIN forum ON forum.autor = user.user_id
Max Damage
Nie do końca się zrozumieliśmy. Pierwsze zapytanie służy oczywiście do określenia wiersza - z którego mają być pobierane różne dane - na podstawie id_artykulu. Np. Kiedy umieszczony, temat itd. Tak też jest pobierany autor postu, nie jest to jednak jego numer id a nick.
Może i dało się to jakoś lepiej zrobić ale nie wiedziałem jak więc jest jak jest....
Teraz chodzi o takie zapytanie aby porównać : forum.autor do user.nick czy są obydwa takie same, jak tak to bierzemy jego id (czyli user_id). I się wyświetla wtedy link poprawnie.
Jak masz na to wszystko lepszy pomysł to daj znać. Chętnie to poprzerabiam....

PS. Przerobiłem więc twoje zapytanie na coś takiego:
  1. SELECT user_id FROM user LEFT JOIN forum ON forum.autor = user.nick

Czy tak to powinno być?
Mam też problem innego rodzaju. Gdy dopisuje te 3 linijki:
  1. <?php
  2. $zapytanie2="select user_id from user left join forum on forum.autor = user.nick"; 
  3. $wynik2=$lacz->query(zapytanie2) or die ('zapytanie: '.$zapytanie.'---blad:'.mysql_error());
  4. $wiadomosc2=$wynik2->fetch_array();
  5. ?>

Wyswietla mi się w pewnym sensie błąd:
  1. <?php
  2. zapytanie: select * from forum where id_artykulu='20'---blad:
  3. ?>

Wie ktoś może dlaczego?
AxZx
Cytat
Jak masz na to wszystko lepszy pomysł to daj znać. Chętnie to poprzerabiam....


juz ci napisalem jaki mam lepszy pomysl
zapisuj ID autora a nie jego nick.

  1. <?php
  2. $wynik2=$lacz->query(zapytanie2) or die ('zapytanie: '.$zapytanie.'---blad:'.mysql_error());
  3. ?>


tu miala byc zmienna $zapytanie2
czyli
  1. <?php
  2. $wynik2=$lacz->query(zapytanie2) or die ('zapytanie: '.$zapytanie2.'---blad:'.mysql_error());
  3. ?>
Max Damage
Super. Działa tak jak chciałem. Wielkie dzięki za pomoc : )
Nie wiem czy zapisywanie id jest lepsze. Na pewno porównanie dwóch id by było szybsze, tylko że przy odczytywaniu autora wyświetlał by się jego id a nie nick, czyli musiałbym zrobić chyba jeszcze jedno zapytanie do bazy. Nie wyjdzie przypadkiem na to samo?

Edit: Ok, nieco się pośpieszyłem z tym podziękowaniem. Mianowicie ciągle odczytuje mi user_id na wartość 1 - niezależnie od nicku. Zdaje się, ze w tym zapytaniu ciągle jednak coś nie gra. Wie ktoś co jest nie tak?
nospor
  1. SELECT user.user_id FROM user, forum WHERE forum.autor=user.nick AND forum.id_artykulu='$id_artykulu'


pozatym lepszym rozwiazaniem by bylo, jakbys w forum.autor trzymal jego id a nie nick.
AxZx
a przy odczytwaniu poprostu robisz zlaczenie tabeli z autorami i w ten sposob, majac dane ID autora pobierasz jego nazwe.
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.