Nasıl bir döngü içinde bu sorguyu kaldırabilirim?

2 Cevap php

Şu anda kişisel bir proje olarak bir forum tasarlama. Ben geldim yinelenen konulardan biri döngüler veritabanı sorgularını. Ben tablo birleşimler kullanarak veya daha sonra kullanmak üzere dizilerdeki verilerin önbelleğe tarafından şimdiye kadar bunu önlemek için idare ettik.

Şu anda olsa ben ben kolayca bu yöntemlerden birini kullanabilirsiniz şekilde kod yazmak nasıl emin değilim bir durum geldim. Ancak ben yine de şimdiye kadar sayfa başına 5 sonuçlandı forumlar, grup başına bu operasyon yerine + 1 1 için en fazla 2 sorguları yapmak için tercih ediyorum. 5 büyük numarası (ben eklediğiniz her forum grup için artacak olsa da) burada benim için önemli ilkedir değil iken Yani, ben döngüler sorguları yazmak istemediğin

Ne yapıyorum forum endeksi gruplaşmaları (örneğin yönetici forumlar, kullanıcı forumları, vb) ve daha sonra tek bir sayfa indeks o grup içindeki her bir forum, bana sorunu mucip bir sayfada hem kombinasyonu görüntüleniyor. Sadece sayfa başına tek bir grup olsaydı, ben bir tablo katılmak ve sorun çözüldü kullanmak istiyorum. Ama ben, bir tablo burada birleştirme kullanırım ben potansiyel olarak tüm verileri alabilirsiniz, ancak ben bunun sonuçlarından biri kitle olacak lüzum ve düzgün görüntülenmesi gerekiyorsa.

İşte kod (netlik için html bazı kaldırdık) bulunuyor

<?php
    $sql= "select * from forum_groups"; //query 1
    $result1 = $database->query($sql);
    while($group = mysql_fetch_assoc($result1)) //first loop
      {?>
        <table class="threads"> 
        <tr>
              <td class="forumgroupheader"> <?php echo $group['group_name']; ?> </td>
            </tr>
            <tr> 
          <td class="forumgroupheader2"> <?php echo $group['group_desc']; ?> </td>
            </tr>
       </table>
       <table>
        <tr>
        <th class="thforum"> Forum Name</th>
        <th class="thforum"> Forum Decsription</th>
        <th class="thforum"> Last Post </th>
        <tr>
            <?php 

                $group_id = $group['id'];
                $sql = "SELECT forums.id, forums.forum_group_id, forums.forum_name, forums.forum_desc, forums.visible_rank, forums.locked, forums.lock_rank, forums.topics, forums.posts, forums.last_post, forums.last_post_id, users.username
FROM forums 
LEFT JOIN users on forums.last_post_id=users.id 
WHERE forum_group_id='{$group_id}'";
                //query 2
                $result2 = $database->query($sql);
                while($forum = mysql_fetch_assoc($result2))
                                            //second loop        
                    {?>

So how can I either
a) write the SQL in such a way as to remove the second query from inside the loop or
b) combine the results in an array
either way I need to be able to access the data as an when so I can format it properly for the page output, ie within the loops still.

2 Cevap

Ben sizin yaklaşım çok kötü olduğunu ve bunu değiştirmek olmaz sanmıyorum. Eğer forumları (grubu ile katılmak) ve grup kimliği tarafından sırasını seçmek Ancak, bir egzersiz olarak tek sorguda tüm yapabilirdi. Yalnızca bir seçme yaptık ve döngü başlayabilir yolu. Group_id değişti eğer döngü içinde kontrol ederim. Varsa, o zaman yeni bir grup üstbilgisi başlar.

Bu ultra yüksek trafik sitesi ise onlar inşa oldum sonra sayfaları diske yazılır, bu yüzden de önbelleğe içine bakabilirsiniz.

Burada grup değişikliği algılamak nasıl bir örnek:

$currentGroupId = 0;
$firstTime = true;
while ($row = mysql_query_fetch_assoc($res)) {
    if ($row['group_id'] != $currentGroupId) {
        $currentGroupId = $row['group_id'];
        if (!$firstTime) {
            // echo close group html
        } else {
            $firstTime = false;
        }
        // echo open group html
    }

    // do forum stuff
}
// echo close group html

İki sorgu ile yapabilirsiniz. (Şahsen ben kullanmayı tercih ediyorum rağmen SELECT *) ilk sorgu değişmesine gerek yoktur. Eğer yinelemeye başlamadan önce ikinci sorgu, forum_groups ile katılmak ve döngü dışında çalıştırmak için değiştirilmesi gerekir:

SELECT forum_groups.id, ...other columns here...
FROM forum_groups 
JOIN forums ON forum_groups.id = forum_group_id
LEFT JOIN users ON forums.last_post_id = users.id

Ayrıca tek seferde tüm verileri getirir kocaman bir sorgu içine bu iki sorguları birleştirebilirsiniz, ancak bu gereksiz verileri dönen gerektirir gibi muhtemelen bu yapmak istemiyorum.