Mysql 如何在Laravel中实现我的sql语句?
我有下面的MySQL查询,运行良好。它从我的表中返回随机结果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
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分。这是这个问题的一个新答案。这个答案是经过测试的,它是有效的。