如何在Laravel中实现我的sql语句?

时间:2015-07-06 22:44:15

标签: mysql laravel laravel-5

我有以下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语句?

1 个答案:

答案 0 :(得分:1)

您可以使用DB::statementDB:rawDB::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语句的随机结果 Random results from MySQL

Laravel中的mysql语句的随机结果 Random results in Laravel

注意:

1-我已经为你解决了这个问题,但我遇到了一个小问题,我在Laracast论坛得到了Kryptonit3的意见。

2-你可能会找到这个问题的其他解决方案,或者可以用不同的方式解决,但我选择以这种方式解决。

注释1中的完整问题和答案可以在here找到。