Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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/68.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 根据日期从多个表中选择行_Php_Mysql_Sql_Laravel - Fatal编程技术网

Php 根据日期从多个表中选择行

Php 根据日期从多个表中选择行,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,因此,我尝试根据日期从多个表中选择多行。所以有评论、投票和评论。通常我会根据日期获得10票,然后根据日期获得10条评论,然后获得10条评论。然而,我想一次完成这一切,以便对它们进行排序 我怎么能说抓取30条(投票+评论+评论)(都是单独的表格),这样我就可以得到独特的评论/投票/评论组合,而且总是最近的30条。我假设它是这样的: 从投票、评论、评论中选择*按“创建时间”、“描述”排序您可以使用UNION SELECT created_at, votecomment AS comment FROM

因此,我尝试根据日期从多个表中选择多行。所以有评论、投票和评论。通常我会根据日期获得10票,然后根据日期获得10条评论,然后获得10条评论。然而,我想一次完成这一切,以便对它们进行排序

我怎么能说抓取30条(投票+评论+评论)(都是单独的表格),这样我就可以得到独特的评论/投票/评论组合,而且总是最近的30条。我假设它是这样的:


从投票、评论、评论中选择*按“创建时间”、“描述”排序
您可以使用
UNION

SELECT created_at, votecomment AS comment FROM votes
UNION ALL
SELECT created_at, comment AS comment FROM comments
UNION ALL
SELECT created_at, reviewcomment AS comment FROM reviews
ORDER BY created_at DESC
LIMIT 30;

你得到的是一个笛卡尔式的查询。如果这些表中的每个表都有(比如)100条记录,那么您将得到100x100x100=1000000条返回的记录

尝试:

每个子查询从三个表中获取10条最新记录。外部查询获取这30行,并对其重新排序,使这30行再次按日期/时间顺序排列

固定字符串vots/comments/reviews的内容很简单,这样您就可以确定单个记录来自哪个表


当然,这只有在三个表具有相同的结构时才会起作用。如果字段数不同和/或类型不同,联合将失败。

这是返回指定结果集的一种方法:

SELECT v.created_at, v.fee  AS fee, v.fi  AS fi FROM votes v
 UNION ALL
SELECT c.created_at, c.fo   AS fee, ''    AS fi FROM comments c
 UNION ALL
SELECT r.created_at, r.fum  AS fee, r.foo AS fi FROM reviews r
 ORDER BY 1 DESC
 LIMIT 30
请注意,每个查询返回的列数必须匹配,每个查询返回的数据类型必须匹配


(使列“对齐”,我们可以在选择列表中包含额外的表达式,如上面的
comments
表中的查询所示。表达式也可以进行数据类型转换。在第二次和第三次查询中分配给列的别名无关紧要,结果集中列的名称是从第一次选择中派生的。它们位于在上面的示例中,这只是为了演示如何让列“对齐”……别名并不重要。)

这将创建一个大的交叉连接。您需要澄清……您是在寻找所有三个表中的数据,还是在寻找每个表中的前10行?在第一种情况下,我们需要键来正确连接表…如果是第二种选择,那么它将三个语句合并在一起。您是在寻找原始sql答案还是laravel方法,因为您将laravel放入标记中?表的结构是否接近?表的结构相似但不精确,我在寻找mysql或laravel,为了回答第一条评论,我在寻找30行,它们可以是评论、投票或评论,只要我得到30行,(所有3个表上的相关信息都是相同的)只有当所有表的结构相同时,这才有效,否则联合会将无法回应chrese:每列的列数和数据类型(按位置)需要匹配才能让工会运作。如果查询现在起作用,则从任何一个表中添加或删除列将导致查询中断。我认为MySQL不允许在UNION ALL中的查询中使用ORDER BY;MySQL在最后一次选择之后只允许一个ORDER BY,并且它适用于整个集合。+1。这也可以在没有内联视图的情况下完成;只需使用该内联视图查询,并在结果集中按位置而不是按名称指定排序表达式:
orderby1desc
SELECT v.created_at, v.fee  AS fee, v.fi  AS fi FROM votes v
 UNION ALL
SELECT c.created_at, c.fo   AS fee, ''    AS fi FROM comments c
 UNION ALL
SELECT r.created_at, r.fum  AS fee, r.foo AS fi FROM reviews r
 ORDER BY 1 DESC
 LIMIT 30