php & kullanılarak rasgele veri

3 Cevap php

Ben aşağıdaki gibi bir MySQL veritabanı yapısı vardır:

CREATE TABLE test (
    id int(11) NOT NULL auto_increment,
    title text NULL,
    tags text NULL,
    PRIMARY KEY (id)
);

data on field tags is stored as a comma separated text like html,php,mysql,website,html etc... now I need create an array that contains around 50 randomly selected tags from random records.

Şu anda ben veritabanından 15 rasgele mysql veriyi seçin ve ardından bir dizi 15 kayıtlarından tüm etiketleri tutan) (rand kullanıyorum. Sonra dizi rastgele ve sadece 50 rasgele etiketleri seçmek için () array_rand kullanıyorum.

$query=mysql_query("select * from test order by id asc, RAND() limit 15");
$tags="";
while ($eachData=mysql_fetch_array($query)) {
    $additionalTags=$eachData['tags'];
    if ($tags=="") {
        $tags.=$additionalTags;
    } else {
        $tags.=$tags.",".$additionalTags;
    }
}

$tags=explode(",", $tags);
$newTags=array();
foreach ($tags as $tag) {
    $tag=trim($tag);
    if ($tag!="") {
        if (!in_array($tag, $newTags)) {
            $newTags[]=$tag;
        }
    }
}

$random_newTags=array_rand($newTags, 50);

Şimdi veritabanı üzerinde büyük kayıtları var ve bu nedenle; rand () çok yavaş performans ve bazen çalışmıyor. Yani herkes benim sayfa normal çalışacak şekilde bana doğru bu durumun üstesinden nasıl bildirebilirsiniz.

3 Cevap

ORDER BY RAND() Asla - bu performans için korkunç. Bunun yerine PHP rastlantısallaşmanın yapın. Kimlik otomatik artan bir (iyi yaklaşım olmayabilir) beri böyle bir şey:

$count = mysql_fetch_assoc(mysql_query("select count(1) as count from test"));
$range = range(0, $count['count']);

$selection = array_rand($range, 50);
$sel_list = implode(',', $selection);

$query = mysql_query("select * from test where id in ($sel_list)");

Bu arada, neden sadece daha sonra bu dizeyi patlamaya, bir dize listede etiketlerini koyarak? Sadece baştan bir diziye koydu.

Ben muhtemelen ORDER BY RAND() neden yavaş olduğunu farkında olduğunuzu düşünüyorum. Sorgu, tüm kayıtları okur sonra bir dizin yardımı olmadan bunları emreder.

Eğer 0 ve MAX(id) - 15 arasında rastgele bir sayı seçin ve sonraki 15 satır alırsanız, yeterince rasgele olacak? Kayıtları Sırasız bir şekilde girilir?

SELECT * FROM test
WHERE id >= my_random_value
ORDER BY id
LIMIT 15

Marcus prosedür, örneğin, geliştirilebilir

SELECT * FROM test
WHERE id % round(rand()*(SELECT count(*) FROM test)) = 0
ORDER BY id
LIMIT 15

(and it is not too slow). The only problem is that the above expression does not guarantee that you will get 15 records. Would you like something like this? It could be improved to guarantee 15 records.