【问题标题】:How to select latest records from multiple tables Mysql Php如何从多个表Mysql Php中选择最新记录
【发布时间】:2020-07-11 11:52:17
【问题描述】:

我有三个表,我想根据日期时间获取所有表的记录,

这是我的“用户”表

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

现在我想根据三个表的 createdOn (DESC) 获取 userId='1' 的所有记录 我该怎么做?

我尝试了以下代码,但显示了很多记录(显示错误的结果)

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'

【问题讨论】:

  • 能否请edit您的帖子并添加您想要获得的输出?
  • 不过,我根本看不出该查询是如何工作的。您在查询中使用了ucph,但它们没有在任何地方定义。
  • $Mureinik : 我想根据日期时间记录,意思是记录来自paymentHistory,usr_booking还是cancelPaymentHistory应该根据时间(DESC)显示,希望你理解
  • @MagnusEriksson:请立即查看,编辑我的问题
  • 这让我相信你没有复制/粘贴你的实际代码。始终复制/粘贴真实代码而不重写它,否则您可能会引入新问题(就像我指出的那样),甚至不小心修复了您在真实代码中遇到的潜在问题。

标签: php mysql join


【解决方案1】:

您的查询不正确。 首先,您错过了 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-Statement 之类的 WHERE u.id IN ('1','2','3') 仍然有一个排序列表。

我已经为你准备好了小提琴http://sqlfiddle.com/#!9/ea835a/28/0

【讨论】:

  • OfNine: 但是 orderby 在哪里?我想在分配顺序中根据 createdOn (dateTime) 获取记录
  • createdOn 应该来自哪个表?
  • 我想对所有表使用 createdOn 意味着我想根据日期时间获取记录,我想根据用户的活动时间向用户显示记录
  • 您想按所有表中用户的最新createdOn 订购吗?由于用户表可能只保存每个用户一次,因此结果中的每个用户都会有一条记录。在这种情况下,按多列排序在语义上是无意义的。
  • 是的,你是对的(你的查询仍然给了我太多错误的记录)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
相关资源
最近更新 更多