从多个表中选择并按日期排序所有内容,从最新到最旧,这是一种简单明了的方法吗?
mysql_query("
SELECT *
FROM posts, comments, photos
WHERE userID='$session'
ORDER BY date");
如果我想做那样的话。
答案 0 :(得分:5)
SELECT *
FROM (SELECT userID, Col1, Col2, Col3, date
FROM posts
UNION
SELECT userID, Col1, Col2, Col3, date
FROM comments
SELECT userID, Col1, Col2, Col3, date
FROM photos ) t
WHERE userID = 123
ORDER BY date DESC
答案 1 :(得分:1)
您现有的查询将无法执行您想要的操作。相反,您需要在一些常见列上JOIN
表:
SELECT
posts.*,
comments.*,
photos.*
FROM
posts JOIN comments ON posts.post_id = comments.post_id
JOIN photos ON posts.post_id = photos.post_id
ORDER BY posts.date DESC
请注意,在生产代码中执行SELECT *
或SELECT posts.*
通常 。通常最好明确列出您想要的列,以便确保它们到达的顺序(例如,对于UNION
查询很重要),以及架构是否更改。
SELECT
posts.date,
posts.post_id,
posts.title,
posts.etc,
comments.date,
comments.user,
comments.text,
photos.title
FROM
posts JOIN comments ON posts.post_id = comments.post_id
JOIN photos ON posts.post_id = photos.post_id
/* Also, if multiple tables have a `date` column, you'll need to specify which one
as in `posts`.`date` */
ORDER BY posts.date DESC
答案 2 :(得分:1)
使用ORDER BY或LIMIT子句对整个UNION进行排序或限制 结果,括起单个SELECT语句并放置 最后一个之后的ORDER BY或LIMIT。以下示例使用两者 子句:
(SELECT a FROM t1 WHERE a=10 AND B=1) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
没有括号的语句相当于一个括号为的语句 刚刚出现。
这种ORDER BY不能使用包含a的列引用 表名(即tbl_name.col_name格式的名称)。代替, 在第一个SELECT语句中提供列别名并引用 ORDER BY中的别名。 (或者,请参阅中的列 ORDER BY使用其列位置。但是,使用列位置 不推荐使用。)