Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] Wyświetlanie rekordów
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%)
-----


Mam 2 tabele w bazie:

Wiadomosci:
id_w
od_kogo
do_kogo
tekst

Userzy:
id_u
nazwa

Kiedy user wysyła wiadomość (np. user o nazwie AAA i id=1 do usera BBB o id=2) to w tabeli wiadomości zostanie dodany rekord o wartości pól: od_kogo=1 i do_kogo=2:
  1. INSERT INTO wiadomosci VALUES( NULL , '1' , '2' , 'tekst' )


Moje pytanie brzmi jak wyświetlić te wiadomości tak aby zamiast id userów pojawiły się ich nazwy. Normalnie nie miałem z tym problemów bo robiłem to tak:
  1. SELECT userzy.nazwa , wiadomosci.tekst FROM wiadomosci , userzy WHERE userzy.id = wiadomosci.od_kogo
Ale tutaj jest problem bo przecież pola od_kogo i do_kogo oba są wartościami id z tabeli userzy. Jak skonsrtuować zapytanie aby SQL nie zgłupiał?


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




w, u1 i u2 to aliasy na nazwy tabel, czyli coś równoznaczne z pseudonimem. Jest to robione by unikać powtarzania długich nazw tabel lub by rozróżnić tabele, gdy dołączamy kilkukrotnie tę samą w jednym zapytaniu (IMG:style_emoticons/default/smile.gif) A ja w tym zapytaniu dwukrotnie dołączam tabelę userzy. Skąd więc mam wiedzieć bez aliasu z której z nich wyciągam jaką kolumnę? u1 jest więc równoznaczne w moim przypadku z tabelą userzy dołączaną pierwszym LEFT JOINem. Stąd u1.u_id jest niczym innym jak "pobierz kolumnę u_id z tabeli userzy dołączanej pierwszym LEFT JOINem. Używam nazwy kolumny JAWNIE, ale nazwę tabeli podaję jako alias. JOIN ma wiele możliwości: LEFT JOIN, RIGHT JOIN, INNER JOIN, JOIN, NATURAL JOIN, CROSS JOIN i każda jest dobra do konkretnych zastosowań. Poczytaj więcej dokumentacji lub tutoriali i helpów to będziesz wiedział co kiedy stosować Nieraz bowiem przy większych nieco bazach lub stronach mających wielu odwiedzających to robi kolosalną różnicę w czasie wykonania i samej stabilności strony. Bez optymalizacji error 503 będzie Twoim koszmarem (IMG:style_emoticons/default/winksmiley.jpg)
Rozpiszę Ci dokładnie "czytanie" tego selecta (IMG:style_emoticons/default/smile.gif)
Pobierz kolumny: id_wiadomości z tabeli wiadomości, nazwa z tabeli userzy o aliasie u1 dołączanej pierwszym join i nazwij ją OD, nazwa z tabeli userzy o aliasie u2 dołączanej drugim join i nazwij ją DO, tekst z tabeli wiadomosci,
Pobierz te dane z tabeli: wiadomosci o aliasie w, połączonej z userzy( o aliasie u1 ), za pomocą indeksów od_kogo z tabeli o aliasie w równego u_id z tabeli o aliasie u1, a do nich dołącz tabelę userzy o aliasie u2 za pomocą indeksu do_kogo z tabeli o aliasie w rownego u_id z tabeli o aliasie u2
Posortuj: wszystkie rekordy po id_w z tabeli o aliasie w, malejąco

Takie podejście mocno skraca długie zapytania i wpływa na czytelność kodu, gdyż wiadomo wtedy co się skąd bierze.

Pisząc:
w.w_id wiem, że to kolumna w_id z tabeli wiadomości bo sam ją przy joinie tak nazwałem
u1.nazwa wiem, że to kolumna nazwa z tabeli userzy dołączanej pierwszym LEFT JOIN bo sam ją przy joinie tak nazwałem
u2.nazwa wiem, że to kolumna nazwa z tabeli userzy dołączanej drugim LEFT JOIN bo sam ją przy joinie tak nazwałem

W zapytaniu jeszcze dla wygody kolumnę u1.nazwa nazywam sobie "od", przez co w php pisząc $row['od'] mam od razu login nadawcy wiadomości.

Ale tu już się kłaniają podstawy SQL, które są wspólne i standaryzowane, niezależnie czy używasz MySQL, MSSQL, Sybase czy Oracle bądź innej bazy danych.

Ten post edytował thek 23.08.2009, 13:38:28
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: 6.10.2025 - 11:11