Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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_Mysql - Fatal编程技术网

Php 在sql结果中从特定用户选择固定数量的记录

Php 在sql结果中从特定用户选择固定数量的记录,php,mysql,Php,Mysql,我有两个表-用户和文章 用户: 用户id int 名称varchar 文章: 第11条 用户id int 标题varchar 描述文本 在我的应用程序中,我需要在一页上显示20篇随机文章 我的问题是这样的: SELECT a.title , a.description , u.name FROM articles a JOIN users u USING (user_id) ORDER BY RAND() LIMIT 20 用户在数据库中可以有任

我有两个表-用户和文章

用户:

用户id int 名称varchar 文章:

第11条 用户id int 标题varchar 描述文本 在我的应用程序中,我需要在一页上显示20篇随机文章

我的问题是这样的:

SELECT a.title
     , a.description
     , u.name 
  FROM articles a
  JOIN users u 
 USING (user_id)
 ORDER 
    BY RAND()
 LIMIT 20
用户在数据库中可以有任意数量的文章

现在的问题是,在20个结果中,有9-10个来自单个用户的文章

我希望页面上的20条记录不包含超过3条或4条特定用户的文章

我可以通过SQL查询来实现这一点。我正在使用PHP和MySQL

谢谢你的帮助。

你可以试试这个吗

SELECT * FROM
(

    SELECT B.* FROM 
    (
        SELECT A.*, ROW_NUMBER() OVER (PARTITION BY A.USER_ID ORDER BY A.R) USER_ROW_NUMBER
        FROM
        (
             SELECT a.title, a.description, u.name, RND() r FROM articles a
             INNER JOIN users u USING (user_id)
        ) A

    ) B
    WHERE B.USER_ROW_NUMBER<=4
) C
ORDER BY RAND() LIMIT 20

嗯,我认为这不可能通过纯sql查询实现。 我的最佳想法是创建一个最终显示的文章数组,查询数据库并使用标准的SELECT*FROM articles ORDER BY RAND LIMIT 20

检查一下,确保你确实有20篇文章,没有人违反了每个用户3/4的规则

有另一个要排除的用户数组,可能使用其用户id作为索引和计数值

在您执行添加规则的过程中,如果发现任何用户点击您的规则,请将其添加到数组中

继续运行随机查询,排除用户和文章,直到达到所需数量

让我尝试一些代码。我已经有一段时间没有使用php了

   $finalArray = [];
    $userArray = [];

while(count($finalArray) < 20) {
$query = "SELECT * FROM Articles ";

if(count($finalArray) > 0) {
   $query = $query . " WHERE articleID NOT IN(".$finalArray.")";
   $query = $query . " AND userID NOT IN (".$userArray.filter(>4).")";
} 

$query = $query . " ORDER BY Rand()";



$result = mysql_query($query);
foreach($row = mysql_fetch_array($result)) {

    if(in_array($finalArray,$row) == false) {
           $finalArray[] = $row;
     }
     if(in_array($userArray,$row[userId]) == false) {
          $userArray[$row[userId]] = 1;
     }
     else {
         $userArray[$row[userId]]  = $userArray[$row[userId]] + 1;
}

}

我可以通过SQL查询来实现这一点吗?我不这么认为。可能在存储过程中。但我的建议是将所有或大多数文章都保存在缓存中,并在其上应用该逻辑。使用存储过程需要一些学习。所以我需要找到其他的解决办法。我想知道为什么MySQL在这个问题上没有选择。你回答了你自己的问题,那是因为它非常特殊。不包含超过3篇或4篇来自特定用户的文章这是编程的角色,而不是数据库的角色。我不确定如何通过编程以最佳方式做到这一点。可能会根据我的要求获取30条记录,然后显示20条记录?好吧,您的回答是@Ctznkane525。如果这对你有效,那好吧。但我仍然更喜欢缓存一组文章,并在其上应用逻辑。一些循环和如果,你就完成了。这就是这个网站所做的,缓存,它确实非常快。不得不做一些小的改变…可能有一些语法问题…但我相信主要的概念可能比我的答案更好。一些RAND的东西和函数,比如ROW_NUMBER,麻烦在于随着时间的推移,它们不是变得很慢吗?@RichardHousham没有提到3个子选择。顺便说一句,这是一个很好的答案。是的,对于兰德这样的公司来说,根据日期之类的东西来限制数量通常是个好主意,这样你就不会看整张桌子了。哇。这看起来像是一个查询中的一个查询中的inception-query。我想我理解这个概念。另外,使用日期限制记录也是一个很好的建议。谢谢你们的帮助。我已经拼凑了一些代码来充实我将如何做到这一点。有些方面,如将数组转换为逗号数组和user.filter>4,您必须自己计算-但根据您的用户群,您可能只运行该查询一次或两次。嗨,Richard,谢谢您的帮助。我将尝试Ctznkane525的inception查询和您的逻辑,以查看哪些适合。再次感谢。