Kobi sayfasındaki kategori başına yeni 20 mesajları sorgulamak için en etkili yolu

2 Cevap php

PHP ve MySQL kullanıyorum. Ben fotoğrafları bir tablo var. fotoğraflar tablo var: fotoğraf için bir bağlantı, bir category_id, tarih.

What would be the best way to list all the categories on the page with the newest 20 photos under each?

Şu anda tüm fotoğrafları seçiyorum ve sonra PHP sonra bunları çözmek. Bir kategoride 500 resimleri var alırsa bu çok verimsiz görünüyor. Herhangi bir daha bunun SQL sonu için fikir?

Ben düşündüm diğer tek yolu, döngü her bir kategori için 20 sınırı sorgu oldu, ama 100 kategoriler varsa daha da kötü görünüyor!

pseudo output

[category_list] => {
    [0]=> {
    	'category_title' => 'photos at sunset',
    	'posts' => {
    		[0] => {
    			'photo_link' = '1.jpg',
    		}
    		[1] => {
    			'photo_link' = '2.jpg',
    		}
    	}
    }
    [1]=> {
    	'category_title' => 'photos at sunrise',
    	'posts' => {
    		[0] => {
    			'photo_link' = '1.jpg',
    		}
    	}
    }
}

pseudo code

$query =  
"
SELECT 
	photographs.category_id, photographs.photo_link, categories.title
FROM 
	 photographs
INNER JOIN 
	 categories
ON 
	 category.id = photographs.categories.id
ORDER BY
	 category.id DESC
";

$result = $this->pdo->prepare($query);
$result->execute();

while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
	$post[] = $row;
}
$result = null;

$count = sizeof($post);
//get a list of the categories
for($i=0; $i < $count; $i++) { 
	$categories[$i] = $post[$i]['title'];
}
$categories = array_unique($categories);

//sort categories alphabetically
sort($categories);

//add the newest 20 photos to each category
$categories_count = count($categories);
$posts_count = count($post);
for($i=0; $i < $categories_count; $i++) { 
	$category_list[$i]['post_count'] = 0;
	for($k=0; $k < $posts_count; $k++) { 
		if ($categories[$i] == $post[$k]['category_title']) {
			if ($category_list[$i]['count'] == 19) {
				break;
			}
			$category_list[$i]['category_title'] = $post[$k]['category_title'];
			$category_list[$i]['post'][] = $post[$k];
			$category_list[$i]['post_count']++;
		}
	}
}

2 Cevap

Tek bir sorgu yapılabilir.

Bu tablo şema olduğunu varsayarsak:

CREATE TABLE `parkwhiz_demo`.`test` (
`photo_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`category_id` INT UNSIGNED NOT NULL ,
`date` DATETIME NOT NULL
) ENGINE = MYISAM ;

Bu sorgu ile kategori başına en son 20 fotoğraf sıralı bir listesini alabilirsiniz:

select photo_id, category_id, date
from test
where (
   select count(*) from test as t
   where t.category_id = test.category_id and t.date >= test.date
) <= 20
order by category_id, date desc;

İstediğiniz dizi yapısına benzer bir şey yaratmak için PHP döngü:

$output = Array();
$prevRow = false;
$i=-1;
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
    if (!$prevRow || $row['category_id'] != $prevRow['category_id']) {
        $i++;
        $output[$i]['category_id'] = $row['category_id'];
        $output[$i]['posts'] = Array();
    }

    array_push($output[$i]['posts'], Array('image_id'=>$row['image_id']));
}

Sadece bir öneri, ama nasıl 'kategorilerinin listesi için bir sorguyu çalıştıran ve LİMİT ve BİRLİĞİ bir arada kullanarak öğeler için bir sorgu oluşturmak için sonuçları kullanmak dersin? Bu şekilde sadece iki sorguları yolluyorlar; ama, o çok daha verimli her veritabanı çağrı gerektirir ne kadar havai bağlı ve ne kadar (örneğin paralel deyimini işlerken) UNION gördüğünde optimizasyon mySql yapacak anlatılan ikinci seçenek daha olmadığını mümkündür.

Ben bunu tavsiye bu konuda yeterince bilmiyorum, ama ben denemek bir şey.