2011-07-22 64 views
15

不要想要任何一種JOIN這裏。我使用PHP構建了兩個表的RSS源,並且我想從兩個表中選擇所有行,保持行不同,但是按照共同的created列進行排序。從兩個表格中選擇單獨的行,按日期排序

舉例來說,如果我有一個表foo

id  downloads views created 
----------------------------------------------- 
1  12   23  2011-07-22 00:10:16 
2  51   900  2011-07-22 10:11:45 
3  8   80  2011-07-23 04:12:18 

和一張桌子bar

id  title  body created 
----------------------------------------------- 
1  foo   ogblog 2011-07-21 10:54:07 
3  bar   zip  2011-07-24 10:54:07 
4  zip   bar  2011-07-25 10:54:07 

我想選擇由公共created列排序兩個表的所有數據,因此示例結果集將是(忽略bar.id,因爲它不需要):

id  title  body  downloads views created    | table 
------------------------------------------------------------------------------- 
NULL bar   zip   NULL  NULL 2011-07-24 10:54:07 | bar 
NULL foo   ogblog  NULL  NULL 2011-07-21 10:54:07 | bar 
1  NULL  NULL  12   23  2011-07-22 00:10:16 | foo 
2  NULL  NULL  51   900  2011-07-22 10:11:45 | foo 
3  NULL  NULL  8   80  2011-07-23 04:12:18 | foo 
NULL zip   bar   NULL  NULL 2011-07-25 10:54:07 | bar 

table列是不需要的;我添加它使事情變得更容易理解。

希望這是明顯的,我想要做的;而不是做一個JOIN其中一行是從兩個表中的列生成的,我想要獲取具有公共列布局的所有行數據,其中表中不存在的任何列將其放入其中。

如果您需要澄清,請讓我知道。

+0

'UNION ALL'聽起來像你需要(用虛擬列考慮到結構上的差異) –

回答

22

使用的僞列,以解決不同的結構,工會加入他們和家長選擇來處理排序:

SELECT * FROM (
    (SELECT foo.id, NULL AS title, NULL AS body, foo.downloads, foo.views, foo.created FROM foo) 
    UNION ALL 
    (SELECT NULL AS id, bar.title, bar.body, NULL AS downloads, NULL AS views, bar.created FROM bar) 
) results 
ORDER BY created ASC 
+0

非常感謝布蘭登什麼 - 這工作的一種享受。 – Bojangles

13

擴展在@Brendan布倫的建議,這是一個使用UNION ALL應工作的例子爲您提供:

SELECT id as id, NULL as title, NULL as body, downloads as downloads, 
    views as views, created as created, 'foo' as table_name 
FROM foo 
UNION ALL 
SELECT NULL as id, title as title, body as body, NULL as downloads, 
    NULL as views, created as created, 'bar' as table_name 
FROM bar 
ORDER BY created ASC 
+0

在我之前到達那裏的實際查詢! :)總是讓我和聯盟混淆的東西,'ORDER BY'是否適用於整個結果或僅適用於第二個選擇聲明?即在我的回答中,是否有任何意見將其分離出來? –

+0

@Brendan,'ORDER BY'適用於UNION的結果,所以不需要使用子選擇。 –

+0

另外,我在原始查詢中有一些拼寫錯誤。我現在修好了。 –

相關問題