Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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
Php 在SQL语句中获得不同的结果,并按随机顺序排序_Php_Sql_Postgresql - Fatal编程技术网

Php 在SQL语句中获得不同的结果,并按随机顺序排序

Php 在SQL语句中获得不同的结果,并按随机顺序排序,php,sql,postgresql,Php,Sql,Postgresql,所以我每次都试图得到独特的结果,但我无法让它正常工作 用户可以在表中有多个条目,但我希望它只提取两个唯一的条目,无论每个用户在表中可能有多少个条目 这应该没那么难。在MySQL中似乎容易得多,尽管它可能是非标准的。不管怎么说,这就是我所拥有的,它仍然会产生多种结果。它不应该允许多个应该是唯一的mem_id。现在,这允许两个结果使用相同的mem_id SELECT media_id,mem_id FROM battle_entries WHERE active='1' AND mem_id!="

所以我每次都试图得到独特的结果,但我无法让它正常工作

用户可以在表中有多个条目,但我希望它只提取两个唯一的条目,无论每个用户在表中可能有多少个条目

这应该没那么难。在MySQL中似乎容易得多,尽管它可能是非标准的。不管怎么说,这就是我所拥有的,它仍然会产生多种结果。它不应该允许多个应该是唯一的mem_id。现在,这允许两个结果使用相同的mem_id

SELECT media_id,mem_id FROM battle_entries WHERE active='1' AND 
mem_id!=".$mem_id." GROUP BY media_id,mem_id ORDER BY RANDOM() LIMIT 2
编辑:

这就是我的表列看起来的样子,btl_id是bigserial,mem_id,media_id,posted是bigint,active是smallint

可能有多行的mem_id不唯一,因为用户有多个条目。我想按mem_id拉取两个随机但唯一的行,但也要在select中检索media_id。希望这更清楚

试试这个:

SELECT * FROM 
    (SELECT DISTINCT ON (mem_id) mem_id, media_id 
    FROM battle_entries 
    WHERE active='1' AND mem_id!=1) s
 ORDER BY RANDOM() LIMIT 2;

您可以使用行号:

with cte as (
    select
       *,
       row_number() over (partition by mem_id order by random()) as row_num
    from battle_entries
    where active = 1 and mem_id <> 1
)
select *
from cte
where row_num = 1
limit 2

请给出当前结果和预期结果的示例。表架构是什么?您想按mem_id分组,但得到两个随机媒体id,对吗?@muistooshort这是正确的。@muistooshort我用架构信息更新了答案。已尝试使用Distinct。我从您的示例错误中得到这个错误:表达式上的SELECT DISTINCT必须与表达式的初始顺序相匹配第1行:mem_id mem_id,媒体id FROM battle_ent…没有错误,但它总是选择相同的行,但只是交替出现在第一行。所以它不是真正随机的,因为它不会遍历整个表。好吧,你不需要对不满足where条件的行进行随机排序。我加上的小提琴似乎很好用。
with cte as (
    select
       *,
       row_number() over (partition by mem_id order by random()) as row_num
    from battle_entries
    where active = 1 and mem_id <> 1
)
select *
from cte
where row_num = 1
limit 2