从两个表中选择单独的行,按日期排序

Boj*_*les 18 mysql

希望任何形式的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
Run Code Online (Sandbox Code Playgroud)

还有一张桌子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
Run Code Online (Sandbox Code Playgroud)

我想从公共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
Run Code Online (Sandbox Code Playgroud)

table不需要该列; 我添加它以使事情更容易理解.

希望很明显我想做什么; 而不是JOIN在从两个表的列生成行的位置,我希望获得具有公共列布局的所有行数据,其中表中不存在的任何列都NULL放入其中.

如果您需要澄清,请告诉我.

Bre*_*len 32

使用虚拟列来计算不同的结构,使用联合来连接它们,使用父选择来处理排序:

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
Run Code Online (Sandbox Code Playgroud)


Ike*_*ker 15

扩展@Brendan Bullen的建议,这里有一个使用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
Run Code Online (Sandbox Code Playgroud)