MySQL / PHP: gruplarında Sonuçları Listelemek ancak gerekli DB sorguları sınırlamak nasıl

4 Cevap php

Aşağıdaki gibi bir veritabanı var:

---------------------------------------------------------------
|       module_name      |     category    |       content    |
---------------------------------------------------------------
|       module1          |     category1   |       content    |
|       module2          |     category1   |       content    |
|       module3          |     category2   |       content    |
|       module4          |     category3   |       content    |
|       module5          |     category2   |       content    |
---------------------------------------------------------------

Ben sonuçlar grupları oluşturmak mümkün istiyorum ama MySQL sorguları yuvalama olmadan bunu yapmak için en hızlı ve en verimli şekilde anlamaya olamaz. Sonuç (ihmal Styling) gibi görünmelidir:

---------------------------------------------------------------
|       module1         |     category1    |       content    |
|       module2         |     category1    |       content    |
---------------------------------------------------------------

---------------------------------------------------------------
|       module3         |     category2    |       content    |
|       module5         |     category2    |       content    |
---------------------------------------------------------------

---------------------------------------------------------------
|       module4         |     category3    |       content    |
---------------------------------------------------------------

Benim kod gibi görünüyor:

$query  = 'SELECT'
    	. ' DISTINCT'
    	. ' category AS name'
    	. ' FROM #__table'
    	. ' WHERE enabled = 1';
$db->setQuery($query);
$categories = $db->loadObjectList();
foreach ($categories as $category) {
$query	= 'SELECT'
	. ' module_name'
	. ' FROM #__table'
    	. ' WHERE enabled = 1 AND category = \'' . $category->name . '\''
    	. ' ORDER BY id';						
    $db->setQuery($query);
    $results = $db->loadObjectList();
foreach ($results as $result) {
        echo $result->module_name;
    }
}

Bu işler iç içe bir sorgu, ama bunu yapmak için daha iyi bir yolu var mı?

4 Cevap

  1. Sort your recordset by the category column (then by module_name).
  2. Loop through your recordset, keeping track of the category you're in ($current_category).
  3. When the row's category doesn't match $current_category, you start a new grouping.

Daha spesifik olarak, kodunuzu adapte:

$query  = 'SELECT'
        . ' module_name, category'
        . ' FROM #__table'
        . ' WHERE enabled = 1 '
        . ' ORDER BY category, id';                                               
$db->setQuery($query);
$results = $db->loadObjectList();

$current_category = null;
foreach ($results as $result) 
{
    if ($current_category != $result->category)
    {
        // whatever you do to separate the category listings
        //  if you don't do it before the first, check ($current_category != null)

        $current_category = $result->category
    }
    echo $result->module_name;
}

Bir yaklaşım Kategorilere göre tüm satırlar için veritabanını sorgulamak olacaktır, ve daha sonra PHP ayrı tablolar halinde gruplandırma yok. Doğrudan HTML veya başka her grup içinde grup ve satır yapısını yansıtan iç içe diziler bir yapı oluşturmak ve sonra da HTML işlemek için kullanmak kategorisinde ve çıkış değişiklikleri takip satırlar üzerinde yineleme ya.

Benim için senin 3 columsn ve birden çok satır ile 1 masa 3 tabloda sizin datascheme dışarı atarken değil gibi görünüyor. Bu scenariao in:

Tabloları ve kategori üzerinde grup sonuçlarınızı katılın.

Sadece bir dizi kullanın. Veri seti ginormous sürece.

foreach($results as $result)
    //assuming $result is an associative array
    $sorted_results[$result['category']][] = $result;
}

//now you can do fun stuff like
foreach($sorted_results as $category => $category_result_list) {
    //do something meaningful
}

Düzenleme: Sadece kod örneğini gördüm