Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Unikniecie sumowania komentarzy wewnątrz pętli while
medyq
post 29.03.2011, 14:07:43
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 11.03.2011

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


Tworze skrypt który wyciąga z bazy danych rekordy (dajmy na to newsy) i dla każdego z nich sumuje łączną ilośc komentarzy z innej tabeli.

Przykład o jaki mi chodzi najlepiej zobazuje na przykład ten tutek:

http://www.99points.info/2010/09/facebook-...jquery-and-php/

Dla każdego komentarza pod artem zliczane są ilości like. jak widać w tutku zliczenia te są na zasadzie

  1. $result = mysql_query("SELECT *,
  2. UNIX_TIMESTAMP() - date_created AS TimeSpent FROM facebook_collapsed_posts order by p_id desc limit 0,10");
  3.  
  4. $userip = $_SERVER['REMOTE_ADDR'];
  5.  
  6. while ($row = mysql_fetch_array($result))
  7. {
  8. $like_ip = mysql_query("SELECT count(*) FROM facebook_collapsed_ip where post_id = ".$row['p_id']." AND userip='".$userip."'");
  9. $like_ip_num = mysql_num_rows($like_ip);
  10.  
  11.  
  12. $total_likes = mysql_query("SELECT * FROM facebook_collapsed_likes where post_id = ".$row['p_id']." ");
  13. $likes = mysql_fetch_array($total_likes);
  14. $likes = $likes['likes'];


oraz dalej w pętli wyświetlenie czy czytający już to lubi czy nie:

  1. <?php
  2. if($like_ip_num > 0){?>
  3. <a href="java script: void(0)" id="post_id<?php echo $row['p_id']?>" class="Unlike">Unlike</a>
  4. <?php }else{?>
  5. <a href="java script: void(0)" id="post_id<?php echo $row['p_id']?>" class="LikeThis">Like</a>
  6. <?php }?>

Czyli wewnatrz pętli while dla każdego wpisu następuje zliczanie ogólnej ilości polubień oraz sprawdzenie czy czytający polubił już dany wpis. Czyli wyświetlenie 10 rekordów generuje 10x2 resultów.

Istnieje sposób na tego typu optymalizacje?

Wymyśliłem żeby u siebie połączyć w pierwszym zapytaniu tabele przypisując danemu rekordowi odpowiednie like i sprawdzenie na zasadzie:

  1. $result = dbquery("SELECT l.*, s.* FROM ".$db_prefix."wpisr s LEFT JOIN ".$db_prefix."like l ON s.wpis_id=l.like_co ORDER BY wpis_id DESC ");
  2.  
  3. while ($data =dbarray($result) ) {
  4.  
  5. echo" ".$data['wpis_id']." ";
  6.  
  7. if ($data['like_co'] == $data['wpis_id'] && $data['like_kto'] == $userdata['user_id'] ) {echo" usuń znacznik";} else {echo"polub"; }
  8.  
  9. echo"<br /> ";
  10. }


I działa (chyba tongue.gif ). Jeśli danemu wpisowi odpowiada like i lubiący jest czytającym to zobaczy"polub" lub "usuń znacznik". Natomiast całkowita ilośc lików rozwiązałbym dodając dla wpisu dodatkową kolumnę w bazie która przechowywała by łączną sume osób które to lubią w zależności od tego czy lubia czy nie (zmieniane dynamicznie ajaxem)

Dobrze kombinuje? Lepsze by to było niż sumowanie w pętli jak w tutorialu powyżej? A może jest inne lepsze rozwiązanie?

Ten post edytował medyq 29.03.2011, 14:09:59
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: 24.04.2024 - 09:55