【问题标题】:How to implement my sql statement in Laravel?如何在 Laravel 中实现我的 sql 语句?
【发布时间】:2015-09-24 06:06:57
【问题描述】:

我有以下工作正常的 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 语句?

【问题讨论】:

  • @maytham - 在我看来并非如此,无论如何,这是一个糟糕的答案。从目前的问题来看,您无法告诉我原始数据库查询就是答案。不知道他是否在使用 Eloquent,不知道他的问题实际上是什么,此外,对于粗略的平底船,我想说他的问题更多的是他只需要使用 FooModel::orderBy('utilizador_id' )->orderBy('updated_at')->get() 而不是原始 SQL 调用。简而言之,糟糕的答案 = 否决您是否认为这不公平,我不在乎。所以需要高质量的答案,而不是懒惰的分数希望。
  • @DanWhite 经过一番思考我只同意,因此我删除了我的答案,另一个挑战是他自 7 月 6 日以来没有回复任何事情。 :)
  • @maythamcoolio。同样的(ish)问题也可以得到 -8 分
  • 这是对这个问题的全新回答。这个答案已经过测试并且有效。

标签: mysql laravel laravel-5


【解决方案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 语句的随机结果

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

注意:

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

2- 您可能会找到其他解决方案来解决这个问题,或者可以通过不同方式解决,但我选择了这种方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多