![]() |
![]() |
![]()
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:
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: 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ł? |
|
|
![]() |
![]()
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 11:11 |