好吧,我想弄清楚为什么我不明白怎么做这个......
我有两张桌子:
发票:
付款:
所以,这里的目标是加入两个表,其中userID匹配我想要的任何表 - 然后返回按日期排序的所有内容(最近的顶部)。但是,因为每个表中都有一个日期字段,我不确定MySQL将如何处理事情...将自动按两个日期排序?这是我在想的......
"SELECT DISTINCT *
FROM invoices,payments
WHERE {$userID} = invoice.userID
OR {$userID} = payments.userID
ORDER BY date DESC";
但是,我开始明白,也许这甚至不是正确使用join命令......也许我只需要在每个表上获取所有数据,然后尝试用PHP以某种方式对其进行排序?如果这是更好的方法,那么在保持所有行数据的同时进行这种类型的DATE排序的好方法是什么?
我应该补充一点,unix时间戳内的TIME(就是“日期”的存储方式)是不可忽略的 - 它应该按日期和时间排序。
谢谢大家......
答案 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)
如果您的数据标记为Date
,Timestamp
或任何相关内容,则SGBD会对其进行正确排序。如果这就是你所问的那个。
但是如果数据类型是String,即使存储日期,它也不会按照您想要的方式排序。