【问题标题】:Select separate rows from two tables, order by date从两个表中选择单独的行,按日期排序
【发布时间】:2011-07-22 13:11:05
【问题描述】:

想在这里使用任何类型的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,其中一行是从两个表的列生成的,我想用一个通用的列布局获取所有行数据,其中表中不存在的任何列都有NULL放入其中。

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

【问题讨论】:

  • UNION ALL 听起来像您需要的(使用虚拟列来解决结构差异)

标签: mysql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    扩展 @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
    

    【讨论】:

    • 通过实际查询在我之前到达那里! :) 总是让我与 union 混淆的东西,ORDER BY 是否适用于整个结果或仅适用于第二个 select 语句?即,正如我的回答,将它分开有什么意义吗?
    • @Brendan,ORDER BY 适用于 UNION 的结果,因此无需使用子选择。
    • 另外,我的原始查询中有一些拼写错误。我现在修好了。
    • 我使用了 Brendan 的答案,但仍然 +1 是因为我是一个非常乐于助人的人,Ike :-)
    • 我想在相同的数据上过滤两个表,使用 WHERE foo in (1,2,3) 之类的东西。我已经将该位添加到两个 SELECTS 中,它可以工作,但有没有办法不必输入两次?
    猜你喜欢
    • 2017-06-21
    • 2020-03-27
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多