[英]How to select latest records from multiple tables Mysql Php
我有三個表,我想根據所有表的日期時間獲取記錄,
這是我的表“用戶”
id name
1 abc
2 xyz
這是我的表“paymentHistory”
id bookingId userId createdOn
1 101 1 2020-07-10 12:11:14
2 102 1 2020-07-11 10:31:19
3 105 1 2020-07-11 12:31:19
4 109 2 2020-07-10 11:45:32
這是我的表“cancelPaymentHistory”
id bookingId userId createdOn
1 103 1 2020-07-07 11:31:28
2 100 1 2020-07-11 11:31:28
3 109 2 2020-07-08 19:28:41
這是我的表“usr_booking”
id bookingId userId status created_on
1 104 1 Inprocess 2020-07-07 10:31:28
現在我想獲取 userId='1' 的所有記錄,並根據三個表的 createdOn (DESC) 我該怎么做?
我嘗試使用以下代碼但顯示了這么多記錄(顯示錯誤的結果)
SELECT u.id as userId,ph.bookingId as paymentHistoryBooking,cph.bookingId as CancelBookingId,ub.bookingId as usrBooking
FROM users u
JOIN paymentHistory ph ON u.id=ph.userId
JOIN cancelPaymentHistory cph ON u.id=cph.id
JOIN usr_booking ub ON u.id=ub.userId
WHERE u.id='152'
您的查詢不正確。 首先,您錯過了users
表的別名u
,因此第二行必須如下所示:
FROM users u
其次,在第四行你不小心寫了u.id = cph.id
,但你想匹配userId
,而不是cancelPaymentHistory.id
。 此外,您還錯過了cancelPaymentHistory
表的別名。 所以正確的第四行必須如下所示:
JOIN cancelPaymentHistory cph ON u.id = cph.userId
整個查詢看起來像:
SELECT u.id as userId,ph.bookingId as paymentHistoryBooking,cph.bookingId as CancelBookingId,ub.bookingId as usrBooking
FROM users u
JOIN paymentHistory ph ON u.id=ph.userId
JOIN cancelPaymentHistory cph ON u.id=cph.userId
JOIN usr_booking ub ON u.id=ub.userId
WHERE u.id='152';
要按所有表的最新createdOn
排序結果,您必須首先確定所有表的最新createdOn
:
SELECT userId, max(createdOn) as latestActivity
(SELECT userId, max(createdOn) as createdOn
FROM cancelPaymentHistory
UNION
SELECT userId max(createdOn) as createdOn
FROM usr_booking
UNION
SELECT userId max(createdOn) as createdOn
FROM paymentHistory)
此結果必須與先前的查詢連接:
SELECT u.id as userId,ph.bookingId as paymentHistoryBooking,cph.bookingId as CancelBookingId,ub.bookingId as usrBooking
, max(latestActivity)
FROM users u
JOIN paymentHistory ph ON u.id=ph.userId
JOIN cancelPaymentHistory cph ON u.id=cph.userId
JOIN usr_booking ub ON u.id=ub.userId
JOIN (SELECT userId, max(createdOn) as latestActivity
FROM (SELECT userId, max(createdOn) as createdOn
FROM cancelPaymentHistory
UNION
SELECT userId, max(created_on) as created_on
FROM usr_booking
UNION
SELECT userId, max(createdOn) as createdOn
FROM paymentHistory) a) activity ON activity.userId = u.id
WHERE u.id='1'
ORDER BY activity.latestActivity DESC;
請注意,我仍然在查詢中得到了ORDER BY
。 我假設您想為多個用戶運行此語句,因此您可以修改WHERE
語句,如WHERE u.id IN ('1','2','3')
並且仍然有一個排序列表。
我已經為你設置了一個小提琴http://sqlfiddle.com/#!9/ea835a/28/0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.