Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jakie zapytanie?
slavo
post 12.02.2005, 16:53:57
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.06.2004
Skąd: Wałbrzych

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
popbart
post 12.02.2005, 18:19:20
Post #2





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

Ostrzeżenie: (0%)
-----


  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


--------------------
Visual Basic - kto by pomyślał :)
Go to the top of the page
+Quote Post
slavo
post 12.02.2005, 18:36:40
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.06.2004
Skąd: Wałbrzych

Ostrzeżenie: (0%)
-----


i do tego jeszcze:
  1. ORDER BY RAND() LIMIT 30

tak?
Go to the top of the page
+Quote Post
popbart
post 12.02.2005, 18:43:41
Post #4





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

Ostrzeżenie: (0%)
-----


Tak smile.gif


--------------------
Visual Basic - kto by pomyślał :)
Go to the top of the page
+Quote Post
slavo
post 13.02.2005, 10:11:51
Post #5





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.06.2004
Skąd: Wałbrzych

Ostrzeżenie: (0%)
-----


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..

Ten post edytował slavo 13.02.2005, 12:55:16
Go to the top of the page
+Quote Post
popbart
post 13.02.2005, 13:44:48
Post #6





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

Ostrzeżenie: (0%)
-----


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


--------------------
Visual Basic - kto by pomyślał :)
Go to the top of the page
+Quote Post
slavo
post 13.02.2005, 13:50:58
Post #7





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.06.2004
Skąd: Wałbrzych

Ostrzeżenie: (0%)
-----


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..

Ten post edytował slavo 13.02.2005, 13:52:28
Go to the top of the page
+Quote Post
popbart
post 13.02.2005, 14:12:12
Post #8





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Visual Basic - kto by pomyślał :)
Go to the top of the page
+Quote Post
slavo
post 13.02.2005, 14:22:02
Post #9





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.06.2004
Skąd: Wałbrzych

Ostrzeżenie: (0%)
-----


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.

Ten post edytował slavo 13.02.2005, 14:35:36
Go to the top of the page
+Quote Post
popbart
post 13.02.2005, 15:59:05
Post #10





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

Ostrzeżenie: (0%)
-----


  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.


--------------------
Visual Basic - kto by pomyślał :)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 05:52