Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak wyciagnąć z kilku tabel rekordy o tej samej nazwie ?
Forum PHP.pl > Forum > Bazy danych > MySQL
adamski9000
Witam wszystkich forumowiczów.
Mam następujący problem z wydawało by się prostym zapytaniem sql. Jednakże meczę się z tym od kilku dni. Na googlu ciężko znaleźć odpowiedz, gdyż trudno jasno zdefiniować pytanie smile.gif

Mianowicie mam 4 poniższe tabele. Próbuję wyciągnąć z nic wszystkie dane łącznie z informacja o numerach telefonu. No i tu zaczyna się problem. Zapytanie które stosuje:

  1. SELECT * FROM rozmowy,smsy,numery_telefonow,raporty
  2. WHERE raporty.id_raport='$id_raport'
  3. AND rozmowy.id_raport=raporty.id_raport
  4. AND smsy.id_raport=raporty.id_raport
  5. AND numery_telefonow.id_numer_telefonu=rozmowy.id_numer_telefonu
  6. AND numery_telefonow.id_numer_telefonu=smsy.id_numer_telefonu
  7. AND numery_telefonow.id_numer_telefonu=raporty.id_numer_telefonu
  8. ORDER BY smsy.DATA DESC


Powyższe zapytanie wyświetla jeden wynikowy rekord i to tylko z jednym numerem telefonu. W dodatku nie wiem której tabeli ten numer tel. dotyczy. A gdzie reszta numerów ? Nie ma !

1) Dlatego pytanie, jak zrobić aby wyświetlały się wszystkie przypisane numery telefonu przypisane do danego rekordu ?
2) Dodatkowo chciałbym kolejno wyświetlic wyniki sortując rozmowy,smsy wg daty. Ale jak to zrobić to już nie mam pojęcia. Sortowanie przez ORDER BY smsy.data nie zda rezultatu.

Bardzo bym prosił doświadczonych użytkowników o pomoc w tym męczącym mnie problemie smile.gif


ROZMOWY
-------
id_rozmowa
adreat
data
id_numer_telefonu
id_raport


SMSY
-----
id_sms
adresat
data
id_numer_telefonu
tresc
id_raport


NUMERY_TELEFONOW
----------------
id_numer_telefonu
numer_telefonu


RAPORTY
-------
id_raport
data
id_numer_telefonu
imei


Z góry dziękuję
Sztef89
wydaje mi się ze musisz skorzystać z funkcji JOIN aby połączyć tabele.
Tu wszystko jest ładnie opisane: http://www.elektroonline.pl/a/2460,Komenda...SQL,baza_wiedzy
Dasz radę wink.gif
sunpietro
skorzystaj z aliasów dla pól, zamiast *. Na przykład, zamiast:
  1. SELECT * FROM .....

Zrób tak:
  1. SELECT r.adresat AS "rozmowa_adresat", s.adresat AS "sms_adresat" .... FROM rozmowy r JOIN smsy s ON r.id_raport=s.id_raport


To tylko przykład, ale pokazuje o co kaman, a przy okazji przyspieszasz zapytanie wybierając tylko to co Ci jest potrzebne.
toaspzoo
  1.  
  2. $zap = mysql_query("
  3. SELECT * FROM rozmowy,smsy,numery_telefonow,raporty
  4. WHERE raporty.id_raport='$id_raport'
  5. AND rozmowy.id_raport=raporty.id_raport
  6. AND smsy.id_raport=raporty.id_raport
  7. AND numery_telefonow.id_numer_telefonu=rozmowy.id_numer_telefonu
  8. AND numery_telefonow.id_numer_telefonu=smsy.id_numer_telefonu
  9. AND numery_telefonow.id_numer_telefonu=raporty.id_numer_telefonu
  10. ORDER BY smsy.DATA DESC;");
  11.  
  12. $il = mysql_num_rows($zap);
  13.  
  14. for($i=0;$i<$il;$i++)
  15. {
  16. $wiersz = mysql_fetch_array($zap);
  17.  
  18. echo $w['wiersz'];
  19.  
  20. }


oczwiście nie wiem, jaka funkcja zastępuje u Ciebie mysql_query

bez pętli wyświetlisz tylko jeden rekord
adamski9000

No to utknąłęm na dobre ! Mimo przestudiowania kilku poradnikow z SQL nadal nie mogę odnaleźć odpowiedzi na ten wydawalo by się banalny problem. Nigdzie nie jest napisane jak wyciagnac z kilku tabel wiersz o tej samej nazwie kolumny. Uzycie JOIN nie rozwiązuje problemu. Nawet jeśli zwraca poprawną ilość rekordów to nadal nie wysiwtlają się wyniki z kolumn o tej samej nazwie ( id_numer_telefonu ). Wyswietla się jeden numer telefonu dla danej kolumny i żaden więcej. Aliasy też nie dają rozwiązania. Bo niby jak nadać alias dla kolumny której nie ma.

Kicha, nie wiem jak to dalej ugryzć, choć jestem przekonany, że rozwiązanie jest stosunkowo proste. Tylko jak je odnaleźć ? wink.gif

pozdrawiam
Adam
toaspzoo
select
tabela1.kolumna as nazwa jaka bede sie poslugiwal
tabela2.kolumna as nazwamojanowa
tabela3.kolumna as nazwa_moja

a w 1 zapytaniu na dole piszesz order by smsy nie podajac kolumny, np ordr by smsy.id
adamski9000
To jak sie aliasy nadaje to ja wiem, ale to nie rozwiazuje problemu. Tylko jak nadac nazwę kolumnie, która ma powstac z polaczenia dwóch kolumn np. telefony.id_numer_telefonu=numery_telefonow.id_numer_telefonu AND smsy.id_numer_telefonu=numery_telefonow.id_numer_telefonu. W SELECIE wybieramy tylko rozmowy.id_numer_telefonu, gdyz nie ma bezposredniej kolumny rozmowy.numer_telefonu.

  1. SELECT
  2.  
  3. RO.id_numer_telefonu AS ro_id_num_tel,
  4. RA.id_numer_telefonu AS ra_id_num_tel,
  5. S.id_numer_telefonu AS s_id_num_tel,
  6. NT.numer_telefonu AS nt_num_tel
  7.  
  8. FROM
  9.  
  10. rozmowy AS RO,
  11. smsy AS S,
  12. numery_telefonow AS NT,
  13. raporty AS RA
  14.  
  15. WHERE
  16.  
  17. RA.id_raport=1 AND
  18. RO.id_raport=RA.id_raport AND
  19. S.id_raport=RA.id_raport AND
  20. NT.id_numer_telefonu=RA.id_numer_telefonu AND
  21. NT.id_numer_telefonu=RO.id_numer_telefonu AND
  22. NT.id_numer_telefonu=S.id_numer_telefonu


Powyzsze zapytanie generuje wyniki tylko z jednym i tym samym numerem telefonu i w dodatku generuje nie takie wyniki jakie bym sobie zyczyl wink.gif, wiec gdzies tu jest błąd logiczny.

Poprawnie natomiast zwraca wyniki poniższa komenda z JOIN, jednak nadal nie wyswietla wszystkich kolumn z numerami telefonow, a powinny byc przeciez 2 kolumny z numerami telefonow. Jest tylko jedna.
  1. SELECT *
  2. FROM numery_telefonow
  3. JOIN rozmowy USING(id_numer_telefonu)








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.