Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: uzycie "LIMIT" w zapytaniu dotyczacym 2 tabel
Forum PHP.pl > Forum > PHP
AniaR
Witam,
Mam takie zapytanie:

$query = "select z.*, w.* from wydarzenia w left join zdjecia z on w.id = z.id_kat order by w.id desc";

za pomoca jego wyswietlam nazwe wydarzenia a nastepnie pod nim wszytskie zdjecia nalezace do tego wydarzenia.

Ale potrzebuje wyswietlic tylko 2 pierwsze wydarzenia wraz ze zdjeciami wiec robie tak:

$query = "select z.*, w.* from wydarzenia w left join zdjecia z on w.id = z.id_kat order by w.id desc LIMIT 2";

Jednak nie wyswietlaja mi sie dwa wydarzenia, a dwa zdjecia do wydarzenia co oznacza ze LIMIT 2 odnosi sie do tabeli zdjecia a nie wydarzenia. Nie wiem jak mam to zmodyfikowac aby tyczylo sie wydarzen.... Czy ktos zna odpowiedz?
okitoki
za mało informacji podałeś dotyczących tabel i zapytań
krowal
To nie jest tak że "LIMIT odnosi się do tabeli zdjęcia a nie wydarzenia" LIMIT odnosi się do wybranych rekordów a Ty widocznie nie wiesz za bardzo jakie dane są wybrane po operacji JOIN smile.gif. Przyklad (dwie tabele):
Kod
wydarzenia
id            nazwa
1             Super news
2             Fajny news

zdjecia
id            wydarzenie_id       nazwa
1             2                   photo1
2             1                   photo2
3             1                   photo3
4             2                   photo4
5             2                   photo5
6             2                   photo6
Po takim zapytaniu:
SELECT w.*, z.* FROM wydarzenia AS w LEFT JOIN zdjecia AS z ON w.id = z.wydarzenie.id
wynikiem bedzie cos takiego:
Kod
id            nazwa           id            wydarzenie_id       nazwa
1             Super news      2             1                   photo2
1             Super news      3             1                   photo3
2             Fajny news      1             2                   photo1
2             Fajny news      4             2                   photo4
2             Fajny news      5             2                   photo5
2             Fajny news      6             2                   photo6

Czyli logiczne że jeśli dodasz do tego LIMIT to wybierze Ci tylko dwa rekordy, czyli 1 wydarzenie + dwa zdjęcia.

Możesz o rozwiązać w taki sposób że wybierasz najpierw dwa wydarzenia a potem w pętli do każdego z nich wybierasz jednym zapytaniem zdjęcia które są podpięte do tego wydarzenia.
AniaR
No wlasnie o to chodzi ze nie chce tego rozwiazac za pomoca 2 zapytan.
Jezeli mam zapytanie: Select w.id as id , z.id as idd from wydarzenia w, zdjecia z. to zeby odwolac sie do id ze zdjec to wiem ze to bedzie idd. Myslalam ze moze jest tez taki sposob ze jezeli wykorzystujemy 'LIMIT' przy 2 tabelach to da mu sie powiediec ktora tabele ma "limitowac"..
No ale wiem juz ze sie nie da: bo moje zapytanie zwraca iles tam rekordow a limit 2 wyswietla tylko 2 z nich i juz rozumiem czemu tak wyswietla..

No ale to nie rozwiazuje mojego problemu..
Moim zadaniem jest wyswietlenie danych z 2 tabel w taki sposob:

wydarzenie1
zdj1
zdj2
..
zdjn

wydarzenie2
zdj1
zdj2
..
zdjn

..

wydarzenieN
zdj1
zdj2
..
zdjn


  1. <?php
  2. $query = "select  z.*, k.* from wydarzenia k left join zdjecia z on k.id = z.id_kat order by k.id desc";
  3.                    $result = $connection->executeQuery($query);
  4.                    $kategoria = null;
  5.                    
  6.                    while ($line = $connection->fetchAssoc())
  7.                    {
  8.                    
  9.                        if($kategoria != $line[tytul])
  10.                        {
  11.                            $kategoria = $line[tytul];
  12.                            
  13.                            print "<a name='$line[id_aktual]' id='$line[id_aktual]'></a><br />";
  14.                            print "<span class='style4'><span class='style5'>$line[tytul]</span><br />";
  15.                            print "</span><span class='style4'>$line[data]</span><br />";
  16.                            print "<br/>";
  17.                            if ($line[tresc] <> null)
  18.                            {
  19.                                print "$line[tresc]<br /><br />";
  20.                            }
  21.                            print "$line[tresc2]<br /><br />";
  22.                            
  23.                                if ($line[sciezka_m] <> null)
  24.                                {
  25.                                    print "Zobacz zdjęcia:<br /><br />";
  26.                                }
  27.                            
  28.                            }
  29.                        
  30.                            if(!empty($line['sciezka_m']))
  31.                            {
  32.                    
  33.                                print"<a href='$line[sciezka_d]' rel='lightbox[roadtrip$line[id_kat]]'><img src='$line[sciezka_m]' class='zdjecie' width=\"107\" border='0' /></a>";
  34.                            
  35.                            }
  36.                            
  37.                      
  38.                }
  39. ?>


I to juz mam ale musze te wydarzenia wraz ze zdjeciami wyswietlac po 2 na stronie.. czyli pageing.
Wystarczy ze uda mi sie uzyc LIMIT do tych 2 tabel by wyswietlilo mi tylko 2 pierwsze wydadzenia wraz ze zdjeciami, a dalej juz bede wiedziala co robic..

Wiem ze mozna to zrobic za pomoca 2 zapytan:
  1. <?php
  2. $kategorieSql = mysql_query('select * from Kategorie order by nazwa asc');
  3.  
  4. while($kategoria = mysql_fetch_assoc($kategorieSql)) {
  5.  
  6.   echo $kategoria['nazwa'] . '<br>';
  7.  
  8.   $zdjeciaSql = mysql_query('select * from Zdjecia where id_kategorii = ' . $kategoria['id']);
  9.   while($zdjecie = mysql_fetch_assoc($zdjeciaSql)) {
  10.      echo $zdjecie['sciezka'] . '<br>';
  11.   }
  12.  
  13. }
  14. ?>


ale to " pokazuje jedną z gorszych praktyk, jakie można stosować przy zabawie z SQL. Uzależniasz ilość zapytań od ilości rekordów w bazie. Jeśli w tabelce 'Kategoria' będziesz miał 1k rekordów, to 'Zdjęcia' wykonasz 1k zapytań. Jeśli będzie tam 100k rekordów, to liczba zapytań będzie odpowiednio większa. Trzeba się wystrzegać powielania złych nawyków"

Dlatego zrobilam to za pomoca jednego zapytania.. I teraz mam problem..
krowal
Masz problem bo za pomocą jednego zapytania nie da się tego zrobić smile.gif Możesz ewentualnie skrócić proces wyciągania każdej listy kategorii do dwóch zapytań (to chyba najoptymalniejsze co się da wymyślić). Jednym zapytaniem wyciągasz dwa rekordy na stronę z tabeli kategorie, a potem drugim zapytaniem wyciągasz zdjęcia do kategorii np za pomocą IN(...) "..WHERE zdjecie.id_kategorii IN(12, 32).." gdzie 12 i 32 to id wcześniej wyciągniętych kategorii. Wrzucasz to potem wszystko ładnie do jednej tablicy i masz drzewko z dwiema kategoriami i zdjęciami do nich, a wszystko w dwóch zapytaniach smile.gif

EDIT:
Albo jeszcze jeden sposób, też na dwa zapytania.
Wyciągasz najpierw sumę rekordów, które musisz wydobyć, np tak:
Kod
SELECT k.id, COUNT(*) AS amount FROM kategorie AS k LEFT JOIN zdjecia AS z ON k.id = z.id_kategorii GROUP BY k.id ORDER BY k.id LIMIT 2

A potem sumujesz z tych rekordów pole amount i wyciągasz już normalnie LEFT JOIN z limitem ustawionym na tę sumę i ORDER BY na k.id
AniaR
Super Krowal, dziekuje bardzo za podpowiedzi. Wiem juz od ktorej strony mam to podejsc:) Pozdrawiam:)
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.