【问题标题】:Order by date from two tables using Union alternative使用联合替代从两个表中按日期排序
【发布时间】:2014-03-13 15:32:02
【问题描述】:

我有这两张桌子

cmets

| ID | COMMENT | FULLNAME       | PHOTO_ID |           CREATED_AT            |
|----|---------|----------------|----------|---------------------------------|
| 76 | comment1| John Smith     |       14 | February, 25 2014 10:38:02+0000 |
| 77 | comment2| James Anderson |       14 | February, 25 2014 10:38:14+0000 | 
| 78 | comment3| Will Smith     |       15 |    March, 11 2014 14:24:08+0000 |

观看次数

| ID | USER | PID |           CREATED_AT            |
|----|------------|---------------------------------|
| 63 | user1| 15  | February, 25 2014 11:12:03+0000 |
| 64 | user1| 14  | February, 25 2014 11:14:10+0000 | 
| 66 | user2| 15  | February, 25 2014 11:15:16+0000 |
| 68 | user2| 14  | February, 25 2014 10:38:12+0000 |

我想从comments.commentcomments.fullnameviews.user 中获取值,因此我可以将它们用于 foreach,结果将按日期排序,如下所示:

John Smith added a comment February, 25 2014 10:38:12 //comment1 user2 viewed the file February, 25 2014 10:38:12 //view James Anderson added a comment February, 25 2014 10:38:12 //comment2

我正在使用 UNION 使用此查询,但我认为这不是正确的方法,因为我无法使用全名来判断谁在写评论或查看文件的用户

SELECT comment, fullname, comments.created_at
FROM comments
WHERE comments.photo_id = 14
UNION
SELECT user, '', views.created_at
FROM views
WHERE views.pid = 14
ORDER BY created_at DESC

结果是

|  COMMENT |       FULLNAME |                      CREATED_AT |
|----------|----------------|---------------------------------|
|    user1 |                | February, 25 2014 11:14:10+0000 |
| comment2 | James Anderson | February, 25 2014 10:38:14+0000 |
|    user2 |                | February, 25 2014 10:38:12+0000 |
| comment1 |     John Smith | February, 25 2014 10:38:02+0000 |

那么,有没有另一种方法来组合这两个表,按日期排序并单独获取行? 这是sqlfiddle

【问题讨论】:

  • 这两张表是什么关系?
  • 它们之间没有关系。

标签: mysql sql union


【解决方案1】:

不是 100% 确定这是否是您正在寻找的,但您可以试一试……

SELECT IF(comment = 'view', 'view', 'comment') AS type, comment, fullname, created_at
FROM
(
  SELECT comment, fullname, comments.created_at
  FROM comments
  WHERE comments.photo_id = 14
  UNION
  SELECT 'view', user, views.created_at
  FROM views
  WHERE views.pid = 14
) tbl
ORDER BY created_at DESC

sqlfiddle

【讨论】:

  • 根据 OP 请求.. 你的选择应该是这个... SELECT fullname, IF(comment = 'view', 'viewed the file ', ' added the comment ') AS type, created_at,评论
  • @JohnRuddell 这就是我宁愿放在显示代码中的东西。如果您想更改显示的措辞,则不必更新您的查询。所以你会有类似(假设是 PHP)echo ($resultRow["type"] == "view" ? "viewed the file" : "added the comment");
  • 不,我明白了...我更多的是说你如何将其拉出的顺序,以正确的顺序将其拉出更简单,因此您不必在之后进行这些更改,并且如果您在 if() 中输入一个字符串已经更容易使字符串成为 OP 想要的,那么额外的编码来改变它......我的正常偏好虽然
  • 这是完美的。非常感谢!
  • @PatrickQ,添加一个新表怎么样?我应该如何修改这个语句? IF(comment = 'view', 'view', 'comment') 将newtable 添加到type 列?
【解决方案2】:

这应该可以解决问题:

SELECT
    USER, ACTION, TIME
FROM
    (
    SELECT
         FULLNAME as USER
        ,'COMMENT' as ACTION
        ,CREATED_AT as TIME
    FROM comments
    )
    UNION ALL
    (
    SELECT
         USER as USER
        ,'VIEW' as ACTION
        ,CREATED_AT as TIME
    FROM views
    )
WHERE
    VIEWS_PID = 14
OERDER BY
    TIME DESC

【讨论】:

  • 你的表没有别名......而且我认为 VIEWS_PID 不会起作用,因为你没有做到这一点
猜你喜欢
  • 2013-07-21
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多