从超过 1 个表格中选择或创建最近 3 篇文章的视图

Posted

技术标签:

【中文标题】从超过 1 个表格中选择或创建最近 3 篇文章的视图【英文标题】:Select or create a view of last 3 articles from more than 1 table 【发布时间】:2016-04-21 06:51:29 【问题描述】:

我有两张桌子。一个有文章(article),什么是网站上的静态页面。其次是博客文章(blog_article),这些文章只显示在博客页面中。

现在我想在我的主页上显示date 订购的最新文章。从articleblog_article 显示最后 3 个很容易,但我无法同时从这两个显示。

两个表的结构相同,除了article,我只想用cat_id = 3 获取行。

这是article

|----------------------------------------------------------|
| id | name      | content       | date      | cat_id      |
|----------------------------------------------------------|
| 1  | Test 1    | ...           | 2016-01-24 18:26:00 | 3 |
| 2  | Test 2    | ...           | 2016-01-29 18:26:00 | 3 |
| 3  | Test 3    | ...           | 2016-02-07 18:26:00 | 4 |
| 4  | Test 4    | ...           | 2016-02-18 18:26:00 | 1 |
| 5  | Test 5    | ...           | 2016-03-15 18:26:00 | 3 |
|----------------------------------------------------------|

这是blog_article

|----------------------------------------------------------|
| id | name      | content       | date                    |
|----------------------------------------------------------|
| 1  | Blog 1    | ...           | 2016-03-01 18:26:00     |
| 2  | Blog 2    | ...           | 2016-03-10 18:26:00     |
| 3  | Blog 3    | ...           | 2016-04-08 18:26:00     |
|----------------------------------------------------------|

我期望的回报:

|----------------------------------------------------------|
| id | name      | content       | date                    |
|----------------------------------------------------------|
| 1  | Blog 3    | ...           | 2016-04-08 18:26:00     |
| 2  | Test 5    | ...           | 2016-03-15 18:26:00     |
| 3  | Blog 2    | ...           | 2016-03-10 18:26:00     |
|----------------------------------------------------------|

我试过这个命令

SELECT article.name AS name, blog_article.name AS name
FROM article,
     blog_article
WHERE article.cat_id = 3
ORDER BY article.date DESC
LIMIT 3

但没有帮助。我的SQL不太好,我只使用SELECTUPDATEDELETE...基本命令。

或者创建一个视图,但是上面的命令仍然没有成功。

【问题讨论】:

搜索UNION ALL 另外,你的加入没有加入条件!跳过旧的、隐式的、逗号分隔的连接语法,只使用现代的、显式的 join 语法! @FelixPamittan 谢谢我想我知道了 【参考方案1】:

您使用order bylimit 的想法是正确的,但使用(隐式)连接是错误的想法。从逻辑上讲,您希望将文章和博客文章一视同仁,这意味着您需要在它们之间使用union all

SELECT   name
FROM     (SELECT name, date FROM article WHERE cat_id = 3
          UNION ALL
          SELECT name, date FROM blog_article) t
ORDER BY date DESC
LIMIT    3

【讨论】:

【参考方案2】:

你需要使用 mysqlUNION 语句

SELECT name FROM 
    ( ( SELECT article.name AS name, `date` FROM article WHERE article.cat_id = 3 ORDER BY `date` DESC LIMIT 3 )   
    UNION ALL     
    ( SELECT name AS name, `date` FROM blog_article WHERE ORDER BY `date` DESC LIMIT 3 ) ) unified    
ORDER BY `date` DESC LIMIT 3

【讨论】:

13000 分,并给出了应该是评论的答案。 (这是几分钟前给出的。) 真的,您花时间抨击我的第一个答案版本,而不是自己回答问题? 好吧,至少我没有投反对票。说真的,第一个版本并没有太多的答案,而且与 Felix Pamittan 已经存在的评论越来越相似。 @jarlh 用户写了一个答案。如果答案解决了问题并返回了预期的结果,那很好。如果你有什么要补充的,你写了另一个答案或者你编辑......如果他有 13000 点或 1 点,那有什么意义?你的挫败感是什么? 作为额外信息,它具有到 UNION 的链接。此外,第一个版本更旨在向其他人表明此问题有答案(正在进行中),以便他们可以专注于帮助他人

以上是关于从超过 1 个表格中选择或创建最近 3 篇文章的视图的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL中表格中20位数字怎么后4位出现是0,还有就是是科学数值

如何使用 Mailchimp API 3.0 从用户或兴趣中获取超过 10 个条目?

如何从 Perl 创建或读取 OpenOffice 电子表格?

SQL 如何查询指定架构中所有表(或视图)的名称

如果该行具有超过 1 个相同的值/重复,则从选择中排除行

如何调整LISTAGG以在选择查询中支持超过4000个字符?