繁体   English   中英

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

[英]Laravel 4: DB:select returns rows ordered randomly

这是一个很好的。 我正在通过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

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

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

正在混合结果,因此它们似乎不时地在重新排列自己。 知道无论price_sales值是多少,它都应始终返回1,对吗?

编辑2:

当我将ORDER BY移到SELECT时,它表明值实际上保持不变,但是属性在具有相同值的组内移动。 因此,例如,排序值为250 000的三个属性正在彼此之间更改顺序,但不会更改所有结果。

显然,问题是如果没有提供任何特定顺序,MySQL不会承担任何特定顺序。 这意味着-对于每个查询运行,列表可能会以不同的方式排序。 我的问题是-对于具有相同排序值的列表,在具有相同值的列表中顺序是随机的。 由于技术上90%的时间值实际上不同,因此问题不那么容易发现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM