0

我试图从一列中选择随机行但是我有一个问题,我想选择title != '';下面没有给我想要的东西的行。我把这and r1.title != '';显示为空标题。我$row['image_one'];稍后再附和。我有两行,第一行有 image_one 和 title,第二行有 image_one 而不是 title。它显示带有标题的 image_one,然后当我刷新页面时,我得到空页面。我希望它继续只显示带有标题的图像,

SELECT r1.id, title, price, image_one
FROM table AS r1 
    JOIN (
        SELECT (RAND() * (SELECT MAX(id) FROM table)) AS id
    ) AS r2
WHERE 
    r1.id >= r2.id 
AND r1.title != '' 
ORDER BY r1.id ASC
LIMIT 1  

html

<?php include_once("models/config.php");?>
<div class="ho_col_1_pr">
 <?php 
    $stmt = $mydb->prepare("SELECT r1.id, title, price, image_one
            FROM hm_table AS r1 JOIN
               (SELECT (RAND() *
                 (SELECT MAX(id)
             FROM table)) AS id)
            AS r2
     WHERE r1.id >= r2.id and r1.title != ''
     ORDER BY r1.id ASC
     LIMIT 1 ");
     $stmt->execute();
if ( false===$stmt ) {
  die('prepare() failed: ' . htmlspecialchars($mydb ->error));
} 

     ?>
  <?php      
$result = $stmt->get_result(); 
 while ($row = $result->fetch_assoc()) {?>
<div class="pro_img_wrap">

     <div class="hid_tit"><div class="hid_tit_ex"><?php echo wordwrap($row['title'], 50, "<br/>\n", true);?></div></div>

  <?php

  $path = 'images/';
  echo "<a href='test.php?redirect=".urlencode($row['title'])." & item=".$row['id']."'>"."<img src='".$path."".$row['image_one']."' style='width:225px;height:169px;'/>"."</a>";?>
    </div>
    <div class="pr_sep">
    <div class="pr_prod">
  <?php
  var_dump($row['title']) ;
  echo $row['price'];?>
  </div>
 <?php
 }
?></div>
</div>
4

4 回答 4

1

这是因为NULL不一样''。如果需要查找非空标题,则需要将查询更改为:

 SELECT r1.id, title, price, image_one
            FROM table AS r1 JOIN
               (SELECT (RAND() *
                 (SELECT MAX(id)
             FROM table)) AS id)
            AS r2
     WHERE r1.id >= r2.id AND r1.title IS NOT NULL AND r1.title != '' 
     ORDER BY r1.id ASC
     LIMIT 1  

或者更好:

SELECT id, title, price, image_one FROM (
    SELECT id, title, price, image_one, RAND() as rnd
      FROM table
     WHERE title IS NOT NULL AND title != '' 
  ORDER BY rnd
) s
LIMIT  1;
于 2013-11-03T22:46:01.530 回答
1

我最好的猜测是表中的最大 id 有一个空标题。因此,当随机数生成器生成接近 1 的值时,没有记录匹配,并且您的代码将 NULL 值/空行与空字符串混淆。

您可以通过将查询修改为获取随机行的其他方法来解决此问题(如其他答案中所述)。您也可以通过对查询进行小的调整来修复它。首先,这是对您的查询的轻微重写(主要是消除不必要的子查询以获得最大值):

SELECT r1.id, title, price, image_one
FROM table r1 JOIN
     (SELECT RAND() * MAX(id) as id
      FROM table
     ) r2
WHERE r1.id >= r2.id AND r1.title != '' 
ORDER BY r1.id ASC
LIMIT 1;

解决方法是title != ''在子查询中重复条件:

SELECT r1.id, title, price, image_one
FROM table r1 JOIN
     (SELECT RAND() * MAX(id) as id
      FROM table
      WHERE title != ''
     ) r2
WHERE r1.id >= r2.id AND r1.title != '' 
ORDER BY r1.id ASC
LIMIT 1;

当然,做你想做的更简单的方法是:

SELECT r1.id, title, price, image_one
FROM table r1
ORDER BY rand()
LIMIT 1;

但是,这在大型表上确实存在可伸缩性问题。

于 2013-11-03T23:55:25.283 回答
0

尝试这个:r1.title <> ''

https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_not-equal

于 2013-11-03T22:59:38.893 回答
0

尝试这个:

WHERE r1.id >= r2.id and char_length(coalesce(r1.title,'')) > 0
于 2013-11-03T22:51:25.007 回答