簡體   English   中英

如何 select 來自多個表的最新記錄 Mysql Php

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM