SQL选择rand并更新结果

时间:2012-08-20 20:37:02

标签: php mysql sql

我有这个横幅系统在我的网站上运行。我有一个SQL表,可以存储id,链接,标题,打印和点击等内容。

因此,我需要在给定页面上随机打印它们,并使用打印件+ 1值更新打印件coloumn(这是显示此横幅的次数)。我正在进行2个查询,选择然后进行更新,但我知道只有一个查询可以做,但我听说它对SQL + PHP不太健康。但是,当我运行脚本时,它会将值加两次,其中应该是一次打印更多,它添加了2.已经检查过脚本是否每个id运行两次,但事实并非如此,它正常运行。代码如下:

$query = 'SELECT * FROM banners WHERE (NOW() BETWEEN ban_start_date AND ban_final_date) AND ban_paid = "y" AND ban_active = "a" ORDER BY RAND() LIMIT 3';
    $query = mysql_query($query) or die(mysql_error());
    while($response = mysql_fetch_array($query)){
        extract($response); 
        $banners[] = array('id' => $ban_id, 'code' => $ban_code, 'img' => $ban_img, 'title' => $ban_title, 'link' => $ban_link, 'prints' => $ban_prints);
        $ban_qr = 'UPDATE banners SET ban_prints = ban_prints + 1 WHERE ban_id = "' . $ban_id . '"';
        $ban_qr = mysql_query($ban_qr) or die(mysql_error);
    }

1 个答案:

答案 0 :(得分:0)

您不能同时选择行并在一个查询中更新它们。您可以更新在一个查询中选择的所有行(使用WHERE ban_id IN (list of IDs)),但仍需要最少两个查询。

$query = "
    SELECT 
        `ban_id` AS `id`, 
        `ban_code` AS `code`, 
        `ban_img` AS `img`, 
        `ban_title` AS `title`, 
        `ban_link` AS `link`, 
        `ban_prints` AS `prints` 
    FROM
        `banners`
    WHERE 
        `ban_paid` = 'y'
    AND 
        `ban_active` = 'a'
    AND
        `ban_start_date` < CURRENT_TIMESTAMP
    AND
        `ban_final_date` > CURRENT_TIMESTAMP
    ORDER BY
        RAND()
    LIMIT 
        3
    ";

$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
  $banners[] = $row;
  $ids[] = $row['id'];
}

$query = "
    UPDATE 
        `banners` 
    SET 
        `ban_prints` = `ban_prints` + 1 
    WHERE 
        `ban_id` IN (" . implode(',', $ids) . ")
    ";

mysql_query($query) or die(mysql_error());