从两个表中选择不同的行,按日期排序。

22

我这里不想使用任何类型的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

表格列不是必需的; 我添加了它只是为了让事情更容易理解。

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

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


"UNION ALL"听起来像是你需要的(使用虚拟列来解决结构差异)。 - Brendan Bullen
2个回答

37

使用虚拟列来考虑不同结构,使用 UNION 连接它们并使用父查询来处理排序:

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

16

在 @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

你在我之前已经提出了实际的查询! :) 联合查询总是让我感到困惑的一点是,ORDER BY 是应用于整个结果集还是仅适用于第二个 SELECT 语句?即像我的答案一样,将其分开是否有意义? - Brendan Bullen
@Brendan,“ORDER BY” 应用于 UNION 的结果,因此无需使用子选择。 - Ike Walker
另外,我的原始查询中有一些拼写错误。我现在已经修正了它们。 - Ike Walker
1
我使用了Brendan的答案,但仍然+1是因为Ike是一个非常有帮助的人 :-) - Bojangles
我想在相同的数据上过滤两个表,使用类似 WHERE foo in (1,2,3) 的东西。我已经将该部分添加到了两个 SELECT 中,这样可以工作,但是有没有不必输入两次的方法? - Clox
对我来说,更好的答案。谢谢。 - VGranin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接