当前位置: 首页 > 知识库问答 >
问题:

Laravel 4:DB:select返回随机排序的行

冯阳华
2023-03-14

这是一个好的。我正在通过DB::select($sql)运行以下查询:

SELECT DISTINCT `listings`.`listing_id` FROM `listings`
STRAIGHT_JOIN `listings_coords` ON `listings_coords`.`listing_id` = `listings`.`listing_id`

LEFT JOIN `listings_lettings`
ON `listings`.`transaction_type` != 1 AND `listings_lettings`.`listing_id` = `listings`.`listing_id`
LEFT JOIN `listings_lettings_rent_frequencies`
ON `listings`.`transaction_type` != 1 AND `listings_lettings_rent_frequencies`.`listings_lettings_rent_frequency_id` = `listings_lettings`.`listings_lettings_rent_frequency_id`
LEFT JOIN `listings_units` ON `listings`.`listings_unit_id` = `listings_units`.`listings_unit_id`

WHERE
`listings`.`active` = 1
AND `listings`.`published_flag` = 1

AND `listings`.`country_id` = 223

AND `listings`.`property_type` = 1
AND `listings`.`listings_status_id` = 1

AND `listings`.`lat` BETWEEN 51.391407971014 AND 51.623292028986
AND `listings`.`lng` BETWEEN -0.31403791919581 AND 0.05851791919581AND st_intersects((SELECT `polygon` FROM locations WHERE location_id = 65), `listings_coords`.`coords`)

ORDER BY

IF(`price_sales` IS NULL AND `price_lettings` IS NULL AND ((`price_per_unit_sales` IS NULL AND `price_per_unit_lettings` IS NULL) OR `max_size` IS NULL), 1,
IFNULL(`price_sales`, IF(`price_lettings` IS NOT NULL, `price_lettings` * IFNULL(`listings_lettings_rent_frequencies`.`months`, 1), IFNULL(`price_per_unit_sales` * `max_size` * `listings_units`.`meters`, `price_per_unit_lettings` * `max_size` * `listings_units`.`meters` * `listings_lettings_rent_frequencies`.`months`)))) DESC

LIMIT 0, 10

现在-在workbench上执行时,查询总是返回完全相同的结果,但是所述函数返回的对象数组的行为很奇怪,也就是说-它将我的结果随机化:

array(10) {
[0]=>
object(stdClass)#548 (1) {
["listing_id"]=>
string(5) "31299"
}
[1]=>
object(stdClass)#547 (1) {
["listing_id"]=>
string(5) "19601"
}
[2]=>
object(stdClass)#550 (1) {
["listing_id"]=>
string(4) "6769"
}
[3]=>
object(stdClass)#551 (1) {
["listing_id"]=>
string(5) "19042"
}
[4]=>
object(stdClass)#552 (1) {
["listing_id"]=>
string(5) "24822"
}
[5]=>
object(stdClass)#553 (1) {
["listing_id"]=>
string(4) "6072"
}
[6]=>
object(stdClass)#554 (1) {
["listing_id"]=>
string(5) "19075"
}
[7]=>
object(stdClass)#555 (1) {
["listing_id"]=>
string(5) "34067"
}
[8]=>
object(stdClass)#556 (1) {
["listing_id"]=>
string(4) "6040"
}
[9]=>
object(stdClass)#557 (1) {
["listing_id"]=>
string(4) "6781"
}
}

这就是我转储查询和结果的方式:

$result = DB::select($sql);
print_r($sql);
echo "\n\n";
dd($result);

每刷新一页,上述结果的顺序都会发生变化(尽管前几个结果保持不变)。我已经坚持了很长一段时间了,所以任何提示都将不胜感激!

编辑:

我说到这里时,顺序如下:

IF(`price_sales` IS NULL, 1, 1) DESC

混合了结果,所以他们似乎时不时地重新安排自己。如果知道无论售价是多少,它都应该返回1,这没有多大意义,对吗?

编辑2:

当我移动ORDER BY以选择它时,显示值实际上保持不变,但属性在相同值的组中移动。例如,排序值为250000的三个属性正在改变它们之间的顺序,但不是在所有结果之间。

共有1个答案

宋建本
2023-03-14

因此,很明显,问题是MySQL没有提供任何特定的顺序。这意味着,每次运行查询时,列表可能以不同的方式排序。我的问题是——对于排序值相同的列表,排序顺序在排序值相同的列表中是随机的。从技术上讲,90%的时间值实际上是不同的,所以问题不那么容易发现。

 类似资料:
  • 问题内容: 我需要创建一个 Java 方法以返回或随机返回。我怎样才能做到这一点? 问题答案: 该类已经具有此功能: 但是,每次需要随机布尔值时始终创建一个新实例并不高效。相反,请在您的类中创建需要随机布尔值的type属性,然后为每个新的随机布尔值使用该实例:

  • 问题内容: 我有以下方法。方法rnd返回两个边界之间的单个随机整数: 如何修改此值,以使返回的数字mod2 = 0? 谢谢 问题答案: 如果您可以获得范围内的随机数,那么您要做的就是获得范围内的随机数并将其乘以2以得到范围内的随机偶数

  • 问题内容: 为了从Sql查询中以随机顺序获取结果,我通常按新的Guid进行排序。我之前已经使用Entity- Framework完成了此操作,但是由于某种原因,它现在无法正常工作。 例如(使用Adventureworks2008r2数据库),我在LinqPad中运行以下查询: 这将生成以下SQL: 那么我的orderby查询发生了什么? 我通过以下查询进一步迈出了这一步,发现它只被调用了一次。 这

  • 问题内容: 我正在使用这个简单的查询来对ms-access数据库使用随机排序: 当我使用Microsoft Access 2010测试它时,它工作正常 但是,当我使用经典asp调用此查询时,随机排序不起作用。 这是我的代码: 问题答案: 您只需要对随机生成器“加盐”即可:

  • 我是Java新手,所以一直在尝试将一些旧的JS练习翻译成Java。

  • 我在编写简单的程序对随机数组进行shellsort时遇到了一个问题。程序不对它排序,只是打印1,1,1,1,1或0,0,0,0,0,0,即使shellsort算法是从rosettacode所以它应该是正确的。