我有以下MySQL查询,工作正常。它从我的表中返回随机结果。
SET @prev=0,@rownum=0;
SELECT utilizador_id, nome
FROM (
SELECT *,
IF( @prev <> utilizador_id,
@rownum := 1,
@rownum := @rownum+1
) AS rank,
@prev := utilizador_id,
@rownum
FROM (
SELECT * FROM anuncios
ORDER BY utilizador_id, rand()
) AS random_ads
) AS ads_ranked
WHERE rank <= 2;
这是我的表格:
+-------------+------+
|utilizador_id|nome |
+-------------+------|
| 1 |test1 |
| 1 |test2 |
| 1 |test3 |
| 1 |test4 |
| 1 |test5 |
| 2 |test1 |
| 2 |test2 |
| 2 |test3 |
| 3 |test1 |
| 3 |test2 |
| 3 |test3 |
+-------------+------|
预期的随机结果:
+-------------+------+
|utilizador_id|nome |
+-------------+------|
| 1 |test2 |
| 1 |test5 |
| 2 |test1 |
| 2 |test2 |
| 3 |test1 |
| 3 |test3 |
+-------------+------|
提到的sql语句在MySQL中工作正常,但我想在我的Laravel环境中实现它。
我的问题:如何在Laravel中实现此sql语句?
答案 0 :(得分:1)
您可以使用DB::statement
,DB:raw
和DB::select
解决此问题。
代码在我的Laravel 5.0测试环境中进行测试,效果很好。
您的mysql语句也经过测试,在MySQL控制台上运行完美。
以下是代码:
DB::statement(DB::raw('SET @prev=0,@rownum=0'));
$results =
DB::select(
DB::raw("
SELECT utilizador_id, nome
FROM (
SELECT *,
IF( @prev <> utilizador_id,
@rownum := 1,
@rownum := @rownum+1
) AS rank,
@prev := utilizador_id,
@rownum
FROM (
SELECT * FROM `anuncios`
ORDER BY utilizador_id, rand()
) AS random_ads
) AS ads_ranked
WHERE rank <= 2;
")
);
查看结果
echo "utilizador_id | nome <br />";
foreach ($results as $result)
{
echo $result->utilizador_id . "__________| " . $result->nome . "<br />";
}
请记住在名称空间后添加use DB;
:
<?php
namespace App\Http\Controllers;
use DB;
我只使用了查看结果代码来演示所有结果输出,但是由你来决定如何操作代码中的数据。
测试结果
MySQL控制台中mysql语句的随机结果
Laravel中的mysql语句的随机结果
注意:
1-我已经为你解决了这个问题,但我遇到了一个小问题,我在Laracast论坛得到了Kryptonit3的意见。
2-你可能会找到这个问题的其他解决方案,或者可以用不同的方式解决,但我选择以这种方式解决。
注释1中的完整问题和答案可以在here找到。