Как выбрать последние записи из нескольких таблиц Mysql Php - PullRequest
0 голосов
/ 11 июля 2020

У меня есть три таблицы, и я хочу получить записи по дате и времени для всех таблиц,

Вот моя таблица «пользователи»

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 (DES C) из трех таблиц. Как я могу это сделать?

Я пробовал использовать следующий код, но показывает так много записей (показывает неправильный результат)

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'

1 Ответ

0 голосов
/ 11 июля 2020

Ваш запрос неверен. Сначала вы пропустили псевдоним u таблицы users, поэтому вторая строка должна выглядеть так:

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 -Statement, например WHERE u.id IN ('1','2','3'), и по-прежнему иметь отсортированный список.

Я настроил для вас скрипку http://sqlfiddle.com/#! 9 / ea835a / 28/0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...