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

时间:2014-06-30 18:36:04

标签: php mysql sql laravel

所以我试图根据日期从多个表中选择多行。所以有评论,投票和评论。通常我会根据日期获得10票,然后根据日期获得10条评论,然后是10条评论。但是我想一次性完成所有操作,以便对它们进行排序。

我怎么能说抓30(投票+评论+评论)(所有单独的表),以便我得到一个独特的评论/投票/评论组合,总是最近的30.我假设它的东西像:

SELECT * from votes, comments, reviews ORDERBY 'created_at', 'DESC'

3 个答案:

答案 0 :(得分:1)

您可以使用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;

答案 1 :(得分:0)

你得到的是一个笛卡儿查询。如果每个表都有(比如说)100条记录,那么最终会得到100x100x100 = 1,000,000条返回记录。

尝试:

SELECT *
FROM (
    SELECT 'votes' AS source_table, * FROM votes ORDER BY created_at DESC LIMIT 10
    UNION ALL
    SELECT 'comments', * FROM comments ORDER BY created_at DESC LIMIT 10
    UNION ALL
    SELECT 'reviews', * FROM reviews ORDER BY created_at DESC LIMIT 10
) AS required_alias
ORDER BY created_at DESC

每个子查询从三个3个表中获取10个最新记录。外部查询占用了这30行,并对它们进行了重新排序,以便这30行再次按日期/时间顺序排列。

固定字符串投票/评论/评论的内容很简单,因此您可以识别个别记录后来的WHICH表。

当然,只有当三个表具有相同的结构时,这才有效。如果它们具有不同数量的字段和/或类型不同,则联合将失败。

答案 2 :(得分:0)

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

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

请注意,每个查询返回的列数必须匹配,并且每个查询返回的数据类型必须匹配。

(为了使列“排列”,我们可以在SELECT列表中包含额外的表达式,如上面comments表中的查询所示。表达式也可以进行数据类型转换。分配给第二个和第三个查询中的列无关紧要,结果集中列的名称来自第一个选择。它们包含在上面的示例中,只是为了获得列“排队”的示例。别名并不重要。)