当前位置: 首页 > 面试题库 >

MySQL联合查询,按2个变量排序

左丘繁
2023-03-14
问题内容

每个表(表1和表2)都有其自己的DATETIME字段。
我正在尝试捕获两个表的ID,并按其DATETIME字段对其进行排序。

例子:

Table 1                        Table 2
------------                 -------------
id |  datetime1               id | table1id  | datetime2
------------------------      -----------------------
1  |  2014-09-21 20:31:26     1  | 2         | 2014-09-21 20:31:29
2  |  2014-09-21 20:31:27     2  | 3         | 2014-09-21 20:31:30
3  |  2014-09-21 20:31:28

Table 3                      
------------               
id |  user               
------------------------   
2  |  phil                
3  |  nathalie

我的输出未通过以下查询正确排序:

SELECT *
FROM (
    SELECT 
    1 AS selection, 
    table1.id, table1.datetime1, 
    table2.datetime2 
    table3.user 
    FROM Table1 
    LEFT OUTER JOIN table2 
    ON table1.id = table2.table1id
    LEFT OUTER JOIN table3
    ON table1.id = table3.id

    UNION ALL

    SELECT 
    2 AS selection, 
    table1.id, table1.datetime1, 
    table2.datetime2 
    table3.user 
    FROM Table1 
    INNER JOIN table2 
    ON table1.id = table2.table1id
    INNER JOIN table3
    ON table1.id = table3.id
) AS query
ORDER BY table1.datetime1 DESC, table2.datetime2 DESC

所需数据:
来自表2 id:2、1,
来自表1 id:3、2、1
因此:2、1、3、2、1

////编辑

对于可能会遇到冗长而复杂的MySQL请求的人们,请在PhpmyAdmin中尝试一下!它会告诉您错误!

////编辑


问题答案:

您真正需要做的是更仔细地考虑您的架构。考虑将日期时间列命名为相同的名称,然后运行这样的查询-http:
//sqlfiddle.com/#!2/a3b4c/7/0

SELECT selection, id, datetimefoo, user FROM (
  SELECT 
    1 AS selection, 
    table1.id, table1.datetimefoo, 
    table3.user 
    FROM table1 
    LEFT OUTER JOIN table2 
    ON table1.id = table2.table1id
    LEFT OUTER JOIN table3
    ON table1.id = table3.id


  UNION

  SELECT 
    2 AS selection, 
    table1.id, table1.datetimefoo, 
    table3.user 
    FROM table1 
    INNER JOIN table2 
    ON table1.id = table2.table1id
    INNER JOIN table3
    ON table1.id = table3.id

  ) AS T2
ORDER BY datetimefoo DESC

在SQL提琴中,这将产生与您要查找的结果更接近的结果。我仍然不确定为什么您需要在第二个查询上使用INNER JOINS-在这里您不需要执行任何操作。

下面是不需要的列名的变化的另一种方法,但需要排序的列的别名-
http://sqlfiddle.com/#!2/ec4bc/3/0

SELECT * FROM (
  SELECT 
    1 AS selection, 
    table1.id, table1.datetimefoo AS sort_date, -- alias on first table's date
    table2.datetimebar,
    table3.user 
    FROM table1 
    LEFT OUTER JOIN table2 
    ON table1.id = table2.table1id
    LEFT OUTER JOIN table3
    ON table1.id = table3.id


  UNION

  SELECT 
    2 AS selection, 
    table1.id, table1.datetimefoo,
    table2.datetimebar AS sort_date, -- alias on second table's date
    table3.user 
    FROM table1 
    INNER JOIN table2 
    ON table1.id = table2.table1id
    INNER JOIN table3
    ON table1.id = table3.id

  ) AS T2
ORDER BY sort_date DESC


 类似资料:
  • 问题内容: 我有这个查询 和同一个1差异。不是 1周 ,而是 1个月 ,我该如何合并这两个并将它们分配给别名? 问题答案: 我将使用条件聚合来做到这一点: MySQL将布尔值视为整数,即为“ true”和“ false”。因此,使用可以计算匹配值的数量。(在其他数据库中,您将使用进行类似的操作。)

  • 问题内容: 如本问题所述,您可以在S中使用字符串文字。 例如,这适用于Oracle: order-by可以采用字符串文字,这是联合结果中列的名称。 (分区表中有成千上万的行,我正试图对那些该死的东西进行分页) 但是,当针对SQLite3运行时,这会生成一个异常: 您如何获得a的结果? 问题答案: 联合查询中的查询不能排序。 为了能够在复合查询中使用限制,必须将单个查询包装在单独的子查询中:

  • 问题内容: 我正在尝试做一个标准查询,该查询返回像常见问题一样的stackoverflow中回答最多的问题。 一个问题包含多个答案。 我试图以标准查询返回按每个问题的答案数排序的最常回答的问题。 有人知道我应该在hibernate标准util中使用什么吗? 问题答案: 这将返回一个Object []列表。每个Object []都将问题的ID作为第一个元素,并将此问题的答案数目作为第二个元素。问题按

  • 问题内容: 我有以下查询: 所以我正在使用并抓住。所以现在,我要获取该image_id并将其从图像表中转换成。 如何将其添加到查询中? 问题答案: 您可以简单地添加另一个联接,如下所示: 但是请注意,由于它是一个,如果您的消息中没有图像,则将跳过整个行。如果可能的话,您可能需要执行一次操作,该操作将仅在存在一个仪表板消息的情况下返回所有仪表板消息和一个image_filename(否则,您将获得n

  • 问题内容: 我正在使用此查询: 产生以下结果: 我改变了场CAT_ID到一个名为新表包含的字段,,。我如何通过也加入该表来编写新查询,以获得与上述相同的结果? 我是数据库新手,需要帮助。提前致谢 问题答案: 试试这个: 这个想法很简单,在新表中的第一个字段是工作作为 代理键 ,它没有任何与其他两个表之间的关系。然后,我们来到了另外两个领域是哪些,这些你应该映射到关系的其他两个方面。 您不能使用新模

  • 我需要从表中选择所有的vip并按兰德排序,然后添加按日期排序的其他数据。在第一个子查询中,一切正常,但在第二个子查询中,spa_date DESC不起作用。我知道UNION子查询中的ORDER BY子句会被忽略而没有限制(但ORDER BY rand()起作用),但我需要所有查询(1+2)中的限制,而不是子查询中的限制 问题: 我需要选择spa_vip=1的所有spa_id并按RAND()排序,然