加入两个表,然后按日期排序,但结合两个表

时间:2011-03-12 19:33:50

标签: php mysql sql-order-by

好吧,我想弄清楚为什么我不明白怎么做这个......

我有两张桌子:

  • 发票

    • ID
    • 用户ID
    • 金额
    • 日期
  • 付款

    • ID
    • 用户ID
    • 金额
    • 日期

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

"SELECT DISTINCT *
            FROM invoices,payments
            WHERE {$userID} = invoice.userID
            OR {$userID} = payments.userID
            ORDER BY date DESC";

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

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

谢谢大家......

3 个答案:

答案 0 :(得分:4)

如果两个表的列相同,则可以使用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`

修改

阅读UNIONS上MySQL manual的相关部分。还有其他方法来表达这一点,但这是我的首选风格 - 任何人都应该清楚,ORDER BY子句适用于UNION的两个方面的结果。粗心写入的UNION - 即使使用ORDER BY - 仍然可能使最终结果集处于不确定的顺序。

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

答案 1 :(得分:2)

因为你有两个相同的名为date的字段,所以MySQL不会知道你想要订购哪一个。

"SELECT DISTINCT *
            FROM invoices,payments
            WHERE {$userID} = invoice.userID
            OR {$userID} = payments.userID
            ORDER BY invoices.date, payments.date DESC";

这会对发票日期,付款日期进行排序 - 如果这是您要查找的内容

答案 2 :(得分:0)

如果您的数据标记为DateTimestamp或任何相关内容,则SGBD会对其进行正确排序。如果这就是你所问的那个。

但是如果数据类型是String,即使存储日期,它也不会按照您想要的方式排序。