连接两个表,然后按日期排序,但合并两个表

Sha*_*ock 2 php mysql sql-order-by

好吧,我想弄清楚为什么我不明白如何做好...

我有两个表:

  • 发票

    • ID
    • 用户身份
    • 数量
    • 日期
  • 付款

    • ID
    • 用户身份
    • 数量
    • 日期

因此,这里的目标是连接两个表,其中用户 ID 匹配我想要的任何内容 - 然后返回按日期排序的所有内容(最近在顶部)。但是,因为每个表中都有一个日期字段,所以我不确定 MySQL 将如何处理事情......会自动按两个日期排序吗?这就是我的想法......

"SELECT DISTINCT *
            FROM invoices,payments
            WHERE {$userID} = invoice.userID
            OR {$userID} = payments.userID
            ORDER BY date DESC";
Run Code Online (Sandbox Code Playgroud)

但是,我开始明白,也许这甚至不是 join 命令的正确用法……也许我只需要单独获取每个表上的所有数据,然后尝试用 PHP 以某种方式对其进行排序?如果这是更好的方法,那么在保持所有行数据完整的同时进行这种类型的 DATE 排序的好方法是什么?

我应该补充一点,unix 时间戳中的 TIME(这就是“日期”的存储方式)不可忽略——它应该按日期和时间排序。

谢谢大家...

Mar*_*ker 5

如果两个表的列相同,则可以使用 UNION

SELECT X.*
  FROM ( SELECT `id`,
                `userID`,
                 'INVOICE' AS PTYPE
                 `amount`,
                 `date`
            FROM `invoices`
           WHERE {$userID} = userID  
          UNION
          SELECT `id`,
                 `userID`,
                 'PAYMENT' AS PTYPE
                 `amount`,
                 `date`
            FROM `payments`
           WHERE {$userID} = userID  
        ) X
 ORDER BY X.`date`
Run Code Online (Sandbox Code Playgroud)

编辑

阅读有关 UNIONS 的MySQL 手册的相关部分。还有其他表达方式,但这是我的首选风格 - 任何阅读 ORDER BY 子句适用于UNION 双方结果的人应该清楚。一个不小心编写的 UNION - 即使有一个 ORDER BY - 仍然可能以不确定的顺序留下最终结果集。

PTYPE 的目的是该查询返回一个名为 PTYPE 的额外列,该列指示每个单独的行是 INVOICE 还是 PAYMENT ... 即。它来自两个表中的哪一个。这不是强制性的,但在工会中通常很有用