Witam, potrzebuję zwrócić wszystkie rekordy z 2 tabel jednocześnie gdzie nick to sesja zalogowanego. Czy jest na to jakiś skuteczniejszy sposób jak pisanie dwóch zapytań gdzie zwracam wszystkie rekordy najpierw z jednej tabeli a później z drugiej?
Poczytaj sobie o czymś takim jak: JOIN w MySQLu. Za jego pomocą można właśnie wyciągnąć dane od razu z dwóch tabeli.
Jak nie będzie mógł czegoś zrozumieć / napisać. To opisz jak dokładnie wygląda u ciebie struktura w bazie danych.
$stmt=$this->db->prepare('SELECT * FROM tabelaA INNER JOIN tabelaB WHERE tabela.nick =: tabela.nick');
$stmt->bindParam(':nick',$_SESSION['sesja_zalogowanego'],PDO::PARAM_STR);
$stmt->execute();
foreach($stmt as $row)
{
}
Mam takie zapytanie, lecz wyświetla Mi błąd. W jaki sposób bindować parametry podczas łączenia tabel w PDO ?
Binduje się w dokładnie taki sam sposób. Bindowanie nie zależy od tego co jest w zapytaniu.
W zapytaniu zapomniałeś o ON. Spróbuj coś takiego.
SELECT * FROM tabelaA INNER JOIN tabelaB ON tabelaA.jednaKolumna = tabelaB.innaKolumna WHERE tabelaA.nick = :nick;
A co mają znaczyć te tabelaA.jedna_kolumna = tabelaB.inna_kolumna do czego odnosić ma ta jedna_kolumna oraz inna_kolumna ?
TabelaA - załóżmy że to tabela z identyfikatorami sesji, a kolumna w niej ( jedna_kolumna ) to np. session_id ( nie wiem jak to nazwałeś ).
TabelaB - to na przykład tabela z nickami i identyfikatorami i tam odwołujesz się do identyfikatora.
Czyli np.
TabelaA
id | session_id
1 | 123456
TabelaB
id | nick
1 | superNick
SELECT * FROM TabelaA INNER JOIN TabelaB ON TabelaA.id = TabelaB.id WHERE TabelaA.session_id = :id_sesji;
Szybki przykład wyniku z phpMyAdmin:
Mam nadzieję, że przynajmniej mniej więcej rozjaśniłem ;)
Dziękuje, sporo Mi rozjaśniłeś, lecz mam jeszcze problem, mianowicie wyświetla Mi tylko produkty z tabeli kupione, a zrealizowanych nie widzi.
Tabela kupione
id | produkt | cena | nick
14 | Stojak | 200 | sesja_usera
Tabela zrealizowane
id | nr_faktury | produkt | cena | nick
1 | 14 | Ścianka |2000 | sesja_usera
$stmt=$this->db->prepare('SELECT * FROM zrealizowane INNER JOIN kupione ON zrealizowane.nick = kupione.nick WHERE zrealizowane.nick = :nick');
Tabele te łączy sesja usera, gdyż w obu jest taka sama.
Ogólnie to chodzi mi o to, aby wyciągało z bazy wszystkie rekordy z 2 tabel, gdzie identyfikatorem jest zmienna sesyjna, nawet jak w drugiej tabeli tej zmiennej nie będzie, musi wyciągać z pierwszej, a jak będzie też w drugiej, to z pierwszej i drugiej.
Wyobraź sobie, że w lewej nawie w kościele siedzą faceci, a w prawej nawie kobiety.
Jeżeli wstaną tylko Ci faceci, którzy mają żony spośród kobiet w prawej nawie, wezmą je za rękę i wyjdą z kościoła, to to jest INNER JOIN, bo wyjdą tylko pary.
Jeżeli wstaną wszyscy faceci, a Ci którzy mają żony spośród kobiet w prawej nawie, wezmą je za rękę i wyjdą z kościoła, to to jest LEFT JOIN, bo wyjdą kawalerzy i kilka par.
A co mają znaczyć te tabelaA.jedna_kolumna = tabelaB.inna_kolumna
lewaNawa.facet = parwaNawa.mąż