Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在Laravel中实现我的sql语句?_Mysql_Laravel_Laravel 5 - Fatal编程技术网

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

Mysql 如何在Laravel中实现我的sql语句?,mysql,laravel,laravel-5,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 := ut

我有下面的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 |
+-------------+------|
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;
        ")
    );
前面提到的sql语句在MySQL中运行良好,但我想在我的Laravel环境中实现它


我的问题:如何在Laravel中实现这个sql语句?

您可以通过使用
DB::statement
DB:raw
DB::select
来解决这个问题

该代码在我的Laravel5.0测试环境中进行了测试,效果非常好

您的mysql语句也经过测试,它在mysql控制台上工作得非常好

代码如下:

+-------------+------+
|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 |
+-------------+------|
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 />";
}
mysql控制台中mysql语句的随机结果

您的mysql语句在Laravel中的随机结果

注意:

1-我自己为你们解决了这个问题,但我遇到了一个小问题,我在Laracast论坛上得到了氪星3的意见

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


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

@maytham-对我来说似乎不是这样,不管怎样,这是一个糟糕的答案。从目前的问题来看,您不能告诉我原始数据库查询就是答案。不知道他是否在使用雄辩,不知道他的问题实际上是什么,而且,对于一个粗略的比喻,我想说他的问题更多的是他只需要使用FooModel::orderBy('utilizador_id')->orderBy('updated_at')->get(),而不是原始的SQL调用。简单地说,糟糕的答案=否决票不管你认为这是否不公平,我都不在乎。所以需要高质量的答案,而不是懒惰的分数。@DanWhite经过一点思考,我只同意,因此我删除了我的答案,另一个挑战是他自7月6日以来没有回复任何事情。:)@maytham coolio。同样,对于一个相同(ish)的问题,你也可以得到-8分。这是这个问题的一个新答案。这个答案是经过测试的,它是有效的。