Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 使用LIMIT组合两个MySQL select语句_Php_Mysql - Fatal编程技术网

Php 使用LIMIT组合两个MySQL select语句

Php 使用LIMIT组合两个MySQL select语句,php,mysql,Php,Mysql,我正在制作一个提要墙,两个服务将帖子保存到同一个数据库表中 一种发帖服务的使用率比另一种高,因此在墙上我想将每种服务限制在头版上的25篇最新帖子(总共50篇),以获得同等的代表性 这就是我最初拥有的,没有晚上的帖子: $sql = "SELECT * FROM posts"; $sql .= " WHERE disq = 0"; $sql .= " AND approved = 1"; $sql .= " ORDER BY created_at DESC"; $sql .= " LIMIT 50

我正在制作一个提要墙,两个服务将帖子保存到同一个数据库表中

一种发帖服务的使用率比另一种高,因此在墙上我想将每种服务限制在头版上的25篇最新帖子(总共50篇),以获得同等的代表性

这就是我最初拥有的,没有晚上的帖子:

$sql = "SELECT * FROM posts";
$sql .= " WHERE disq = 0";
$sql .= " AND approved = 1";
$sql .= " ORDER BY created_at DESC";
$sql .= " LIMIT 50";
但我试图通过服务来限制他们:

$sql_1 = "SELECT * FROM posts";
$sql_1 .= " WHERE disq = 0";
$sql_1 .= " AND approved = 1";
$sql_1 .= " AND source = 'TW'";
$sql_1 .= " ORDER BY created_at DESC";
$sql_1 .= " LIMIT 25";

$sql_2 = "SELECT * FROM posts";
$sql_2 .= " WHERE disq = 0";
$sql_2 .= " AND approved = 1";
$sql_2 .= " AND source = 'IG'";
$sql_2 .= " ORDER BY created_at DESC";
$sql_2 .= " LIMIT 25";
像这样做

$sql = $sql_1 UNION $sql_2;
似乎不起作用,因为我看到的所有示例都在一系列查询的末尾执行限制。之后应执行命令,按时间顺序重新排列帖子,并使墙混合服务


非常感谢MySQL帮助

您可以在子查询中省略您的订单,只需在联合后的最后执行即可

(
SELECT * FROM POSTS 
WHERE disq = 0 AND approved = 1 AND source= 'TW'
LIMIT 25
)
UNION ALL
(
SELECT * FROM POSTS 
WHERE disq = 0 AND approved = 1 AND source= 'IG'
LIMIT 25 
)
ORDER BY created_at DESC

有关联合和如何排序的更多信息,请参见

。您需要从两个标准集中分别提取最近的25个项目,然后将它们放在一起并重新排序

就这样。您需要这些附加子查询,因为
orderby。。。限制
条款需要分别与每个条款关联

SELECT * 
  FROM 
       ( SELECT * 
           FROM POSTS 
          WHERE disq = 1 AND approved = 1 AND source= 'TW'
          ORDER BY created_at DESC 
          LIMIT 25
        ) A
 UNION ALL
       ( SELECT * 
           FROM POSTS 
          WHERE disq = 1 AND approved = 1 AND source= 'IG'
          ORDER BY created_at DESC
          LIMIT 25 
        ) A
 ORDER BY created_at DESC, source

(disq,approved,source,created_at)
上的POSTS表上的索引将用于加速此查询。

您可以使用临时表存储结果。这样你甚至不需要一个联盟。feed每隔几分钟就会更新一次新的帖子,所以我不确定使用联盟或表有什么更好。不太习惯于比select、update等更复杂的mysql查询。临时查询速度非常快,因为它们在内存中。它们只存在于交易的长度上。我想,OP希望每个交易都有25个。当然,
UNION ALL
,如果没有任何重复项需要删除,则可以提高速度。啊,是的,谢谢,忘了它。在示例中添加了它。对于Kiwizoom:UNION尝试从结果中删除重复项,因此速度稍慢。在这里也检查一下:哦,谢谢。这似乎奏效了。我想我不知道如何写那个联盟的语法。关于UNION ALL的小贴士很有用。此查询很可能获取每个组中最早的行。这当然不是最新的。如果要获得最新的订单,您需要在每个
限制25
之前在DESC创建
订单。disq为0,但这是我这边的小db条件。这是一个正确的答案。你的答案至少得到了OP明确要求的25篇最新帖子。