2011-09-20 392 views
1

我想從2個不同的mysql表中收集數據,按照時間戳排序結果,但不將兩個表中的列合併到一行中。MySQL從2個不相關的表中選擇記錄按時間戳排序

T_ONE(one_idone_someinfoone_ts

T_TWO(two_idtwo_otherinfotwo_ts

注意,字段two_otherinfo是不一樣的one_someinfo,在共同的列只有ID和時間戳。

結果應該是由時間戳排序的兩個表的混合,但根據時間戳,每行應該只包含表的相應列。

例如,如果最新記錄來自T_TWO那行應該有T_ONE列爲空的one_someinfo列。

我只需要訂購來自T_ONE的最新消息和發佈在T_TWO上的最新消息,因此這些表格無關。我想避免使用2個查詢,然後通過使用PHP的時間戳來合併和排序結果。有沒有人知道這個解決方案?在此先感謝


這是表的結構

CREATE TABLE `posts` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `fromid` int(10) NOT NULL, 
    `toteam` int(10) NOT NULL, 
    `banned` tinyint(1) NOT NULL default '0', 
    `replyid` int(15) default NULL, 
    `cont` mediumtext NOT NULL, 
    `timestamp` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE `stars` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `daynum` int(10) NOT NULL, 
    `userid` int(10) NOT NULL, 
    `vote` tinyint(2) NOT NULL default '3', 
    `timestamp` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `posts` (`fromid`, `toteam`, `banned`, `replyid`, `cont`, `timestamp`) VALUES(5, 12, 0, 0, 'mess posted#1', 1222222220); 
INSERT INTO `posts` (`fromid`, `toteam`, `banned`, `replyid`, `cont`, `timestamp`) VALUES(5, 12, 0, 0, 'mess posted#2', 1222222221); 
INSERT INTO `posts` (`fromid`, `toteam`, `banned`, `replyid`, `cont`, `timestamp`) VALUES(5, 12, 0, 0, 'mess posted#3', 1222222223); 

INSERT INTO `stars` (`daynum`, `userid`, `vote`, `timestamp`) VALUES(3, 160, 4, 1222222222); 
INSERT INTO `stars` (`daynum`, `userid`, `vote`, `timestamp`) VALUES(4, 180, 3, 1222222224); 

通過timestamp DESC結果排序應該是臺星與timestamp 1222222224然後表職位的第三條記錄的第二個記錄與timestamp 1222222223以及...因爲表格之間有不同的字段,所以結果的第一行應該包含表格列的列,而表格列的列應該是空的。

+0

只需編輯您的問題,如果您需要提供其他信息。 –

回答

1

一個UNION 的列必須上的每一行相同數據類型。事實上,在第一個UNION子查詢中聲明列別名,因爲它忽略了在後續子查詢中重命名列的任何嘗試。

如果您需要兩個子查詢中的列不同,請將NULL作爲佔位符。以下是一個示例,獲取公共列id和時間戳,然後從每個子查詢中獲取一個自定義列。

(SELECT p.id, p.timestamp AS ts, p.fromid, NULL AS daynum FROM posts) 
UNION 
(SELECT s.id, s.timestamp,  NULL,  s.daynum,  FROM stars) 
ORDER BY ts DESC 

也把括號中的子查詢,所以最後ORDER BY適用於聯盟的整體結果,而不僅僅是最後的子查詢。

1
SELECT one_id AS id, one_someinfo AS someinfo, one_ts AS ts 
UNION 
SELECT two_id AS id, two_someinfo AS someinfo, two_ts AS ts 
ORDER BY ts 
+0

謝謝,我已經嘗試過UNION,但不幸的是表格的字段與彼此不同。他們只有ID和時間戳字段的共同點。因此,該解決方案對我無效 –

+0

您可以發佈您的CREATE TABLE代碼和期望結果的示例嗎? –

+0

我在上面的回覆中發佈了表格的結構,希望它會有所幫助。謝謝你的迴應,我是新來的 –

0
SELECT one_id AS id 
     , one_someinfo AS one_someinfo 
     , NULL   AS two_someinfo 
     , one_ts AS ts 
    FROM t_ONE 
UNION ALL 
    SELECT two_id 
     , NULL 
     , two_someinfo 
     , two_ts 
    FROM t_TWO 
ORDER BY ts 
相關問題