如何构造这个SQL查询?

时间:2011-09-21 03:51:09

标签: php sql content-management-system

所以基本上我收到了关于我网站上新内容的通知。我有4张桌子 -

  • 制品
  • 媒体
  • 更新
  • 评论

每个表都有一组自己的列(如果有人想要,我可以包含这些列)。每个表都有一个不同的列,这是 timestamp 列( big int 格式化列,其中包含来自PHP time()函数的数据)。我获得最后30次修改的解决方案是从按时间戳降序排序的这4个表中选择前30行。

这是我到目前为止的查询,它不起作用,我想知道是否有人可以帮助我。 -

SELECT * FROM `articles` 
UNION SELECT * FROM `media` 
UNION SELECT * FROM `updates` 
UNION SELECT * FROM `comments` 
ORDER BY `timestamp` DESC 
LIMIT 30

修改 我之前也在使用另一个查询 -

SELECT * FROM `articles` ,`media` ,`updates` ,`comments` 
ORDER BY `timestamp` DESC 
LIMIT 30

并不断收到此错误 - 订单子句中的列'timestamp'不明确

编辑2

我现在意识到我必须在我的语句中使用 AS 子句将这些结果合并到一个表中。

2 个答案:

答案 0 :(得分:3)

SELECT a.*,m.*,u.*,c.* from articles AS a
LEFT JOIN media AS m ON (m.timestamp = a.timestamp)
LEFT JOIN updates AS u ON (u.timestamp = a.timestamp)
LEFT JOIN comments AS c ON (c.timestamp = a.timestamp)
ORDER BY timestamp desc LIMIT 30

答案 1 :(得分:0)

您的工会可以工作,但前提是您可以创建某种公共字段列表。例如,假设每个表中都有一个描述字段,名称不同。像这样的东西会起作用......

SELECT TimeStamp,'Articles',Art_desc AS Description FROM articles
UNION ALL
SELECT TimeStamp,'Media',Media_Desc FROM Media
UNION ALL
SELECT TimeStamp,'Updates',Update_Desc FROM Updates
UNION ALL
SELECT TimeStamp,'Comments',Comment FROM Comments
ORDER BY timeStamp DESC LIMIT 30

实质上,您正在创建3个一致列的结果集,因此在这种情况下UNION将起作用。