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

时间:2015-07-20 13:07:00

标签: php mysql sql laravel laravel-4

这是一个很好的。我通过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,对吗?

EDIT2:

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

1 个答案:

答案 0 :(得分:0)

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