duandou8120 2012-08-28 12:44
浏览 25
已采纳

从sql表中选择随机行时如何防止选择已删除的ID

I want to select random rows from a product database by their unique id`s. I need 3-4 random products on every page...

This is how i started

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `products` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `products` WHERE id = $offset LIMIT 1" );
$n=mysql_num_rows($result);

if ($n>0){
    while($row = mysql_fetch_array($result)){ 
        $id = $row["id"];
        $cod_produs = $row["cod_produs"];
        $nume_produs = $row["nume_produs"];
        $titlul_paginii = $row["titlul_paginii"];
        $nume_intermediar = str_replace (" ", "-", $nume_produs);
        $nou_nume_produs = strtolower($nume_intermediar);
        $detalii = $row["detalii"];
        $seo_descriere = $row["seo_descriere"];
        $materiale = $row["materiale"];
        $numere = $row["numere"];
        $pret = $row["pret"];
        $categorie = $row["categorie"];
        $subcategorie = $row["subcategorie"];
        $data_adaugare = strftime("%b %d, %Y", strtotime($row["data_adaugare"]));

    }

echo ("The id of the product is ".$id." and his name is ".$nume_produs);

    };
  ?>

The problem is that my code returns ids that i have deleted over time... how do i prevent doing that?

And how i can return 3 or 4 unique id's at once, and am open to better ways of doing this?

  • 写回答

2条回答 默认 最新

  • dongran1779 2012-08-28 13:05
    关注

    You have a mistake in your script, do this:

    $offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM `products`");
    $offset_row = mysql_fetch_object($offset_result); 
    $offset = $offset_row->offset;
    $result = mysql_query("SELECT * FROM `products` LIMIT $offset, 1");
    $n=mysql_num_rows($result);
    

    But this will return only one record. you can get consecutive records or you have to run it many times.

    $offset_result = mysql_query("SELECT COUNT(*) AS total FROM `products`");
    $offset_row = mysql_fetch_object($offset_result); 
    
    $total = (($offset_row->total) - 1);
    $range_arr = range(0, $total);
    shuffle($range_arr);
    $off_1 = $range_arr[0];
    $off_2 = $range_arr[1];
    $off_3 = $range_arr[2];
    
    $result = mysql_query(" (SELECT * FROM `products` LIMIT $off_1, 1)
                            UNION
                            (SELECT * FROM `products` LIMIT $off_2, 1)
                            UNION
                            (SELECT * FROM `products` LIMIT $off_3, 1)");
    $n=mysql_num_rows($result);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)