如何合并两个表并根据时间戳对它们进行排序?

时间:2016-06-06 20:20:57

标签: php mysql

我有两张表,如下所示

表:行为

ViewBag.UserId

表:behaviour_actions

id - hash - page - timestamp
1 - abc - page 1 - 2016-06-06 13:20
2 - abc - page 2 - 2016-06-06 13:18

用户(哈希)在行为中有多个条目,在behaviour_actions上有多个条目。 我想要做的是加入两个表并按时间戳排序。

因此,最终结果将是两个表的混合,但与时间有关。

我在下面的查询不会按照我的意愿对它们进行排序,因为它不会根据时间将两个表中的每个条目放在彼此之下。我正在使用PHP。我能做些什么呢?

id - hash - page - action - timestamp
1 - abc - page 1 - form - 2016-06-06 13:19
2 - abc - page 2 - form - 2016-06-06 13:12

enter image description here

2 个答案:

答案 0 :(得分:0)

join结合了表行和#39;并排。听起来你应该使用union all运算符来一个接一个地组合行:

SELECT page, timestamp
FROM   behaviour
UNION ALL
SELECT page, timestamp
FROM   behaviour_actions
ORDER BY 2 DESC

答案 1 :(得分:0)

这样的事情应该接近你所要求的。

 SELECT 'ba' AS src
      , ba.page
      , ba.timestamp
      , ba.action
   FROM behaviour_actions ba
  WHERE ba.hash = 'abc'

  UNION ALL

 SELECT 'b' AS src
      , b.page
      , b.timestamp
      , NULL AS action
   FROM behaviour b
  WHERE b.hash = 'abc'
  ORDER BY 2

请注意,要将两个查询排到"排队"对于UNION ALL操作,我们必须返回相同数量的列。因此,我们返回一个NULL值作为结果中action列的占位符。我们可以轻松返回空字符串'' AS action或任何其他表达式。但我们确实需要返回第四列,以便两个查询返回四列。

如果您希望首先列出behaviour行,如果时间戳值匹配...

  ORDER BY 2,1

如果您总是首先想要behaviour行,

  ORDER BY 1,2

不必返回第一列,即鉴别器列。但通常当我得到这样的结果集时,我也想知道哪个SELECT返回了行。在此示例中,值b告诉我这是返回行的behaviour的查询。值ba告诉我,behaviour_actions的查询返回了该行。