mysql查询从多个中选择,按日期排序

时间:2012-01-15 00:41:11

标签: php mysql join union multiple-tables

从多个表中选择并按日期排序所有内容,从最新到最旧,这是一种简单明了的方法吗?

 mysql_query("
               SELECT * 
               FROM posts, comments, photos 
               WHERE userID='$session' 
               ORDER BY date");

如果我想做那样的话。

3 个答案:

答案 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使用其列位置。但是,使用列位置   不推荐使用。)

- > http://dev.mysql.com/doc/refman/5.0/en/union.html