【问题标题】:How to structure this SQL query?如何构造这个 SQL 查询?
【发布时间】:2011-09-21 03:51:09
【问题描述】:

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

  • 文章
  • 媒体
  • 更新
  • cmets

每个表都有一组自己的列(如果有人愿意,我可以包含这些列)。每个表都有一个不同的列,这是 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

并不断收到此错误 - 订单子句中的“时间戳”列不明确

编辑 2

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

【问题讨论】:

  • 当您说“它不起作用”时,您应该始终指定它“不起作用”的症状 - 它是否会产生错误消息(如果是,确切的消息是什么) ?它会给你结果,但不是你想要的结果(如果是,它会给你什么结果does)?等等。
  • UNION 仅适用于表具有相同字段的情况,如果每个表具有不同的字段集,则会出现错误

标签: php sql content-management-system


【解决方案1】:
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

【讨论】:

  • 订单子句中的“时间戳”列不明确
  • 我认为您的示例假设所有 4 个表都使用相同的时间戳值进行更新?他们可能是,但我不确定是不是这样
【解决方案2】:

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

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 将在这种情况下工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-02-19
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多