[SQL][zaawansowane] wybieranie pól z polączonych tabel

0

Witam,
sprawa jest nie łatwa, a właściwie wystarczy pojać o co chodzi i pozniej już będzie lżej. Potrzebuje napisać kwerende wybierająca, która pobiera dane z z tego samego pola jednej tabeli, lecz ta tabela musi zostać pobrana dwukrotnie, gdyż potrzebuje wartość pola w pierwszym i ostatnim rekordzie :)

Przykład:

tabela1: pole1, pole2, pole3
   dane: 1, 2, 3
tabela2: pole4, pole5
  dane: 2, 1
           2, 2
           2, 3
           2, 4

i teraz pobieram rekordy które => tabela2.pole4=tabela1.pole2
wiec będę miał całą tabelę drugą, a w tym zapytaniu chcialbym już uzyskać, np. min(w tym wypadku 1) i max(w tym wypadku 4), ale zaznaczam, że tu nie chodzi o te funkcje, gdyż tak naprawde tabela zawiera text, a nie liczby. Chodzi o dobrze sformuowane zapytanie, sortowani + left join'ty. Wydaje mi się, że raz uzyskałem taki efekt, lecz niestety uciekło mi zapytani i... :/

0

Ja nie do konca rozumiem ;) ale jezeli chcesz w jednym zapytaniu pobrac wiele informacji z jednej tabeli to pomoge. Np. tak sie dzieje teraz na forum. Podczas odczytywania listy postow z danego tematu, zapytanie pobiera nick oraz ID autora postu ORAZ nick ososby, ktora ew. zmodyfikowala dany post. W tym wypadku dwukrotnie pobieramy dane z jednej tabli uzytkownikow.

SELECT p.post_user,
            p.post_edit_user,
            u1.user_id AS u1_user_id,
            u1.user_name AS u1_user_id,
            u2.user_name AS u2_user_name
FROM users u1, users u2
WHERE u1.user_id  = p.post_user
    AND u2.user_id = p.post_edit_user
0

Wydaje mi się, że chodzi Ci o cos takiego:

  SELECT t1.pole1, t2.pole2, t1_2.pole1 as pole_nr_2
  FROM tabela1 t1, tabela2 t2, tabela1 t1_2
  WHERE t1.pole1 = t2.pole2
    AND t2.pole2 = t1_2.pole1

Oczywiscie to wielkie uproszczenie...

0

Oj Panowie, niem ozemy się dogadać :)
Ale znalazłem dobry przykład, chyba najlepszy :)
Tak jak jest na tym forum, plik: forum.php chyba, tam gdzie są wyświetlane wątki w dziale. I tam jest wlasnie też wykorzystane laczenie tabel(ale to już potrafie ;)), jest tam taki moment, iż rekord z tematm zawiera dwa id - id_pierwszego_postu & id_ostatnieg, a to przecieŻ można odczytać z tabeli z postami, tylko wlasnie trzeba naraz odczytać pierwszy i ostatni, kapujecie już? :)

0

jak to zrobisz w jednym zapytaniu nie używając dodatkowych pól (tak jak to jest na forum), to rządzisz.

ja to robię za pomocą dwóch osobnych zapytań - sortowania ASC (DESC) i LIMIT 0,1.

0

jak to zrobisz w jednym zapytaniu nie używając dodatkowych pól (tak jak to jest na forum), to rządzisz.

tak też właśnie myślałem :)

nawet wiem, że jest to możliwe w SQL'u, ale nie w MySql, otóż wykożystuje się zapytania w zapytaniu:) tzw. subqueries np. w PostgreSQL.

0

Podzapytania sa dostepne w wersji MySQL 4.1 (beta), w innych systemach bazodanowych obecne praktycznie od dawna.

Taka konstrukcja forum jaka jest teraz (plik forum.php), pobiera dane w jednym zapytaniu (tak jak powiedzial LF), mozesz zajrzec do zrodel projektu, aby zobaczyc jak to jest wykonywane.

Usuniecie dwoch pol (topic_first_post_id oraz topic_last_post_id) oraz pobieranie pierwszego i ostatniego posta w danym temacie przy kazdej iteracji petli nieco spowalnia caly system. Wykonalem takze test na swoim komputerze: otoz zainstalowalem MySQL 5 (w ktorym rzecz jasna sa podzapytania) i przerobilem odpowiednio skrypty. Konstrukcja wykorzystujaca podzapytania dziala z taka sama predkoscia jak konstrukcja ktora jest stosowana obecnie. Tak wiec jezeli na serwerze zostanie zainstalowana nowsza wersja MySQL, mozna pozbyc sie dwoch kolumn w tabeli coyote_topic, a system bedzie dzialal rownie szybko.

BTW: MySQL 5 jest jakies 0,05 sek. wolniejszy niz MySQL 4.0 ;)

0

Ok, dzięki za wyczerpującą odpowiedź :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1