php - استعلام سكل غير فعال




mysql database (4)

أولا، يجب عدم الاستعلام عن قاعدة البيانات الخاصة بك في طريقة العرض. وهذا من شأنه أن يخلط منطق عملك ومنطق العرض التقديمي. مجرد تعيين نتائج الاستعلام لمتغير في وحدة التحكم الخاصة بك وتكرار من خلال ذلك.

أما بالنسبة للاستعلام، يوب الانضمام يمكن أن تفعل ذلك في الاستعلام 1.

SELECT * -- Make sure you only select the fields you want. Might need to use aliases to avoid conflict
FROM snippets S LEFT JOIN categiries C ON S.category = C.id
WHERE live = 1
ORDER BY S.category, C.name

هذا سوف تحصل على مجموعة نتيجة الأولية. ولكن هذا لن تعطيك البيانات أمرت بشكل جيد كما تتوقع. سوف تحتاج إلى استخدام قليلا من فب لمجموعة في بعض المصفوفات التي يمكنك استخدامها في الحلقات الخاصة بك.

شيء على غرار

$categories = array();
foreach ($results as $result) {
   $snippet = array();
   //assign all the snippet related data into this var

  if (isset($categories[$result['snippets.category']])) {

    $categories[$result['snippets.category']]['snippet'][] = $snippet;
  } else {
    $category = array();
    //assign all the category related data into this var;

    $categories[$result['snippets.category']]['snippet']  = array($snippet);
    $categories[$result['snippets.category']]['category'] = $category;
  }
}

يجب أن يمنحك هذا مجموعة من الفئات التي تحتوي على جميع المقتطفات ذات الصلة في مصفوفة. يمكنك ببساطة حلقة من خلال هذه الصفيف لإعادة إنتاج القائمة الخاصة بك.

أنا بناء التطبيق على شبكة الإنترنت بسيطة في لحظة أنني سوف مفتوحة المصدر يوم واحد. كما هو الحال في هذه اللحظة، يتم إنشاء الملاحة على كل تحميل الصفحة (والتي سوف تتغير ليتم تخزينها مؤقتا في يوم واحد) ولكن في الوقت الراهن، يتم إجراء ذلك مع التعليمات البرمجية أدناه. باستخدام فب 5.2.6 و ميسكلي 5.0.7.7، كيف أكثر كفاءة يمكن أن يكون رمز أدناه؟ أعتقد أن الانضمام قد يساعد، ولكن أنا بعد النصيحة. اي نصيحة ستكون موضع تقدير.

<?php
    $navQuery = $mysqli->query("SELECT id,slug,name FROM categories WHERE live=1 ORDER BY name ASC") or die(mysqli_error($mysqli));
    while($nav = $navQuery->fetch_object()) {
        echo '<li>';
            echo '<a href="/'. $nav->slug .'">'. $nav->name .'</a>';
            echo '<ul>';
                $subNavQuery = $mysqli->query("SELECT id,name FROM snippets WHERE category='$nav->id' ORDER BY name ASC") or die(mysqli_error($mysqli));
                while($subNav = $subNavQuery->fetch_object()) {
                    echo '<li>';
                        echo '<a href="/'. $nav->slug .'/'. $subNav->name .'">'. $subNav->name .'</a>';
                    echo '</li>';
                }
            echo '</ul>';
        echo '</li>';
    }
?>

سأحاول هذا واحد:

SELECT
    c.slug,c.name,s.name
FROM
    categories c
LEFT JOIN snippets s
    ON s.category = c.id 
WHERE live=1 ORDER BY c.name, s.name

لم أكن اختبار ذلك، على الرغم من. تحقق أيضا من الفهارس باستخدام عبارة إكسلين حتى ميسكل لا تفعل مسح كامل للجدول.

مع هذه النتائج، يمكنك حلقة النتائج في فب وتحقق عندما يتغير اسم الفئة، وبناء الانتاج الخاص بك كما يحلو لك.


بالإضافة إلى استعلام واحد واحد يمكنك استخدام اثنين منها منفصلة.

لديك بنية شجرة أساسية هنا مع عناصر فرع (جدول فئات) وعناصر ورقة (جدول قصاصات). عيب الحل استعلام واحد هو أن تحصل على مالك عنصر براش بشكل متكرر لكل عنصر ورقة واحدة. هذا هو معلومات زائدة عن الحاجة، وهذا يتوقف على عدد من الأوراق وكمية المعلومات التي الاستعلام من كل عنصر فرع يمكن أن تنتج كمية كبيرة من حركة المرور إضافية.

يبدو حل الاستعلامين:

$navQuery = $mysqli->query ("SELECT id, slug, name FROM categories WHERE live=1 ORDER BY name")
    or die (mysqli_error ($mysqli));
$subNavQuery = $mysqli->query ("SELECT c.id AS cid, s.id, s.name FROM categories AS c LEFT JOIN snippets AS s ON s.category=c.id WHERE c.live=1 ORDER BY c.name, s.name")
    or die (mysqli_error ($mysqli));

$sub = $subNavQuery->fetch_object ();    // pre-reading one record
while ($nav = $navQuery->fetch_object ()) {

    echo '<li>';
    echo '<a href="/'. $nav->slug .'">'. $nav->name .'</a>';
    echo '<ul>';

    while ($sub->cid == $nav->id) {

        echo '<li>';
        echo '<a href="/'. $nav->slug .'/'. $sub->name .'">'. $sub->name .'</a>';
        echo '</li>';

        $sub = $subNavQuery->fetch_object ();
    } 

    echo '</ul>';
}

يجب أن تطبع تماما نفس الرمز كما المثال الخاص بك

$navQuery = $mysqli->query("SELECT t1.id AS cat_id,t1.slug,t1.name AS cat_name,t2.id,t2.name
    FROM categories AS t1
    LEFT JOIN snippets AS t2 ON t1.id = t2.category
    WHERE t1.live=1
    ORDER BY t1.name ASC, t2.name ASC") or die(mysqli_error($mysqli));

$current = false;

while($nav = $navQuery->fetch_object()) {
    if ($current != $nav->cat_id) {
        if ($current) echo '</ul>';
        echo '<a href="/'. $nav->slug .'">'. $nav->cat_name .'</a><ul>';
        $current = $nav->cat_id;
    }

    if ($nav->id) { //check for empty category
        echo '<li><a href="/'. $nav->slug .'/'. $nav->name .'">'. $nav->name .'</a></li>';
    }
}

//last category
if ($current) echo '</ul>';




mysqli