Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jakie zapytanie?
Forum PHP.pl > Forum > Bazy danych > MySQL
slavo
Mam dwie tabele:

1) id | tytul
2) id | id_tytyl | IP

I teraz pytanie:
Czy za pomoca jednego zapytania moge wyciagnac 30 losowych tytulow ale tak by pozycje dla ktorych w tabeli 2) istnieje IP takie jak podane we wzorcu byly pomijane?

Jesli tak to jak to powinno wygladac?
popbart
  1. SELECT 1.*
  2. FROM 1 INNER JOIN 2 ON (1.id=2.id_tytul)
  3. WHERE 2.ip != wzorzec
  4. GROUP BY 1.id
slavo
i do tego jeszcze:
  1. ORDER BY RAND() LIMIT 30

tak?
popbart
Tak smile.gif
slavo
ulzoylem taki kod:

  1. <?php
  2. $result = mysql_query(&#092;"SELECT * FROM link LEFT JOIN blokada ON link.id = blokada.id_link WHERE blo
    k
  3. da.ip != '$getip' OR blokada.ip IS NULL AND link.cat = '$cat' GROUP BY link.id ORDER BY RAND() LIMIT $limit\");
  4.  
  5. while($row = mysql_fetch_array($result)){
  6. echo $row[tresc];
  7. echo '<br />';
  8. $ile = mysql_query(\"SELECT * FROM link LEFT JOIN blokada ON link.id = blokada.id_link WHERE id_l
  9. nk = '$row[0]' AND ip = '$getip'\");
  10. $ile = mysql_num_rows($ile); echo $ile; echo $getip;
  11.  
  12. if($ile == 0) mysql_query(\"INSERT INTO blokada VALUES('','$row[0]','$getip',NOW())\");
  13. }
  14. ?>


I wsztstko jest dobrze do momentu kiedy w drugiej tabeli nie pojawia sie dwa wpisy o tym samym id_link wtedy sie sypie.. wyswietla wpisy mimo iz zabronione ip jest w tabeli..
popbart
A po co robisz w pętli zapytania?
Takim sposobem zajedziesz bazę smile.gif
Pokaż struktury tabel i co chcesz wyciągnąć, a coś poradzimy winksmiley.jpg
slavo
Tabela 1)
nazwa: link
pola: id | url | tresc | cat

Tabela 2)
nazwa: blokada
pola: id | id_link | ip | time

A co chce zrobic?

Chce wyswietlic 30 losowych wpisow z tabeli 1) ale tak aby dla jednego numeru IP dany wpis pokazywal sie raz na dobe.

Poki co wyrzezbilem cos takiego:

  1. <?php
  2. $getip = getClientIp();
  3.  
  4. $result = mysql_query(&#092;"SELECT * FROM link LEFT JOIN blokada ON link.id = blokada.id_link WHERE blo
    k
  5. da.ip != '$getip' OR blokada.ip IS NULL AND link.cat = '$cat' GROUP BY link.id ORDER BY RAND() LIMIT $limit\");
  6.  
  7. while($row = mysql_fetch_array($result)){
  8. echo $row[tresc];
  9. echo '<br />';
  10. $ile = mysql_query(\"SELECT * FROM link LEFT JOIN blokada ON link.id = blokada.id_link WHERE id_l
  11. nk = '$row[0]' AND ip = '$getip'\");
  12. $ile = mysql_num_rows($ile); echo $ile; echo $getip;
  13.  
  14. if($ile == 0) mysql_query(\"INSERT INTO blokada VALUES('','$row[0]','$getip',NOW())\");
  15. }
  16. ?>


No i wpisy starsze niz 24 h sa z tabeli 2) usuwane..
popbart
Dodaj ile i usuń drugiego selecta smile.gif
  1. <?php
  2. $result = mysql_query(&#092;"SELECT *,count(blokada.id) as ile 
  3. FROM link LEFT JOIN blokada ON (link.id = blokada.id_link) 
  4. WHERE blokada.ip != '$getip' OR blokada.ip IS NULL AND link.cat = '$cat' 
  5. GROUP BY link.id 
  6. ORDER BY RAND() LIMIT $limit&#092;");
  7. ?>
slavo
No i nie bardzo dziala..
Sytuacja wyglada w tym momencie tak..
Wyczyszcze table 2) do zera..
I sprawdzam dzialanie skryptu.. no i owszem.. po wyczerpaniu wszystkich wpisow przestaje je wyswietlac.. i teraz problem.. sprawdzam dzialanie skryptu z innego IP i wpisy moge wyswietlac w nieskonczonosc.. IP nie jest dodawane do listy blokowanych dla konkretnego wpisu..


No dobra.. w tej chwili mam pytanie do pierwszego zapytania:
problem polega na tym ze zapytanie bieze pod uwage tylko ostatnio dodany nr IP, mianowicie:

id | id_link | ip | time
1 | 344 | 215.126.235.256 |
2 | 344 | 125.463.547.856 |
3 | 344 | 456.9563.54.65 |

To zapytanie zablokuje wyswietlanie linku tylko dla ostatnio dodanego IP, pozostale dwa przepuszcza.
popbart
  1. <?php
  2. $result = mysql_query(&#092;"SELECT *,count(blokada.id) as ile
  3. FROM link LEFT JOIN blokada ON (link.id = blokada.id_link)
  4. WHERE blokada.ip != '$getip' AND link.cat = '$cat'
  5. GROUP BY link.id
  6. ORDER BY RAND() LIMIT $limit&#092;");
  7. ?>

Jeszcze przydała by się mała optymalizacja skryptu:
Jeżeli w pętli dodaje się kilka rekordów, to lepiej jest tam stworzyć stringa, a po zakończonej pętli za jednym połączeniem wstawić wszystkie rekordy.
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.