2011-09-21 120 views
0

所以基本上我收到了我網站上新內容的通知。我有4個表 -如何構建此SQL查詢?

  • 文章
  • 媒體
  • 更新
  • 評論

每個表都有一套自己的列(我可以包括這些,如果有人想)。每個表有一個不同的列,這是時間戳列(一個大int格式化列與數據從PHP 時間()函數)。獲得最後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子句將這些結果合併到一個表中。

+0

當你說「它不工作」時,你應該總是指定它的症狀「不工作」 - 它是否產生一個錯誤信息(如果是,那麼確切的信息是什麼)?它是否給你結果,但不是你想要的結果(如果是的話,它會給你什麼結果)?等等。 – Amber

+0

只有在表具有相同字段的情況下,UNION纔有效,如果每個表具有不同的字段集合,則會給出錯誤 – Sparky

回答

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 
+0

order子句中的列'timestamp'不明確 – liamzebedee

+0

@liam'a.timestamp' –

+0

我認爲您的示例假設所有4個表格都使用相同的時間戳值進行更新?他們可能會,但我不確定是這樣 – Sparky

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個一致列,因此聯盟將在這種情況下工作。