如何停止ORDER BY RAND()复制结果?

时间:2016-01-08 05:20:12

标签: php mysql mysqli

我正在尝试从表格位置获取5个随机位置并添加随机照片(通过ID链接到它)。我已经这样做了,它使用ORDER BY RAND()工作正常,但大多数时候结果都是重复的。我会看到相同的“地方”,但另一张随机照片我放了一张图片来解释我所看到的内容。

放置1然后放置另一个放置1

之前有没有人见过这样的东西可以帮助我? 我真的很感激。

enter image description here

我的PHP代码:

a.map.with_index { |i,b| [b,i] } 
  #=> [[0, [1, 2]], [1, [1, 3]], [2, [1, 4]]]

这是HTML

/// 5 random places + 1 random photo for each place

$sqlCommand2 = "SELECT DISTINCT(places.id), places.id AS id, places.title AS title, places.latitude AS latitude , places.longitude AS longitude, places_photos.place_id, places_photos.url AS image FROM places INNER JOIN places_photos ON places.id = places_photos.place_id ORDER BY RAND() LIMIT 5";

  $query2 = mysql_query($sqlCommand2) or die(mysql_error());
  $count2 = mysql_num_rows($query2);
  if($count2 > 1){
    $places .= "";
    while($row = mysql_fetch_array($query2)){

        $places .= "<a href=\"places/p/?id=".$row['id']."\"><div class=\"main-place-item\" style=\"background-image: url('http://Ayoubsi.com/places/p/images/".$row['image']."');\"><div id=\"title\">".$row['title']."</div></div></a>";
            } // close while

  } else {
    $places = "No places!";
  } 

4 个答案:

答案 0 :(得分:2)

您需要group by您的结果,而不是使用DISTINCT。

将您的查询更改为:

$sqlCommand2 = "SELECT places.id, places.id AS id, 
places.title AS title, places.latitude AS latitude ,
 places.longitude AS longitude, places_photos.place_id, 
places_photos.url AS image FROM places 
INNER JOIN places_photos ON places.id = places_photos.place_id 
GROUP BY places.id
ORDER BY RAND() LIMIT 5";

因为即使您使用的是DISTINCT,也可以使用JOIN。

在JOIN中,重复的结果即将到来。

答案 1 :(得分:1)

我认为您不了解SQL关键字 DISTINCT 。这是一个关键字。这是不是一个功能。

SELECT DISTINCT适用于选择列表中表达式的所有,而不仅仅是包含在不必要的parens中的某些列。

当你写这样的陈述时:

  SELECT DISTINCT(a), b, c FROM ...
第一个表达式a周围的那些parens什么都不做。这相当于写作:

  SELECT DISTINCT a, b, c FROM ...

重点是DISTINCT关键字将消除重复的行。在此示例中,abc(合在一起)的值复制ab和{{1}的值从另一行返回。

如果您只需要表达式c的不同值,请使用a子句。

GROUP BY

(注意MySQL具有GROUP BY的非标准扩展,允许表达式 SELECT a, b, c FROM ... GROUP BY a b是非聚合,其他数据库将抛出错误.MySQL将返回一个值cb来自其中一个折叠(“分组”)的行,但这些值中的哪些行不是确定性的。)

答案 2 :(得分:0)

请在RAND()函数中使用“seed”。如下所示。

$seed=time();

$query="SELECT * FROM my_table ORDER BY RAND($seed) LIMIT $amount OFFSET $offset";

答案 3 :(得分:0)

从您的查询中我猜你每个地方都有多张照片。

对于每个地方,您想要随机展示其中一张照片吗?

如果没有,那么您可以使用查询

$sqlCommand2 = "SELECT 
                    `places`.`id`,
                    `places`.`title`,
                    `places`.`latitude`,
                    `places`.`longitude`,
                    `places_photos`.`place_id`, 
                    `places_photos`.`url` AS `image`
                FROM 
                    `places`
                        JOIN 
                            `places_photos`
                        ON 
                            `places`.`id` = `places_photos`.`place_id`
                GROUP BY `places`.`id`
                ORDER BY
                    RAND()
                LIMIT 5";

如果你想选择随机照片,你需要使用像这样的子查询

$sqlCommand2 = "SELECT
                    `x`.`id`,
                    `x`.`title`,
                    `x`.`latitude`,
                    `x`.`longitude`,
                    `x`.`place_id`, 
                    `x`.`url` AS `image`
                FROM (
                    SELECT
                        *
                    FROM 
                        `places`
                            JOIN 
                                `places_photos`
                            ON 
                                `places`.`id` = `places_photos`.`place_id`
                    ORDER BY
                        RAND()
                    ) AS 'x'
                GROUP BY
                    `x`.`id`
                LIMIT 5";