所以我试图根据日期从多个表中选择多行。所以有评论,投票和评论。通常我会根据日期获得10票,然后根据日期获得10条评论,然后是10条评论。但是我想一次性完成所有操作,以便对它们进行排序。
我怎么能说抓30(投票+评论+评论)(所有单独的表),以便我得到一个独特的评论/投票/评论组合,总是最近的30.我假设它的东西像:
SELECT * from votes, comments, reviews ORDERBY 'created_at', 'DESC'
答案 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
表中的查询所示。表达式也可以进行数据类型转换。分配给第二个和第三个查询中的列无关紧要,结果集中列的名称来自第一个选择。它们包含在上面的示例中,只是为了获得列“排队”的示例。别名并不重要。)