用户表:
| id | name | age |
|----|------------|-----|
| 1 | Apple | 22 |
| 2 | Strawberry | 23 |
| 3 | Orange | 50 |
| 4 | Mango | 30 |
会员表:
| id | user_id | expire_at |
|----|---------|----------------------|
| 1 | 1 | 2019-08-17T11:19:30Z |
| 2 | 1 | 2019-08-10T11:20:10Z |
| 3 | 2 | 2019-08-29T11:20:19Z |
| 4 | 3 | 2019-08-02T11:20:30Z |
| 5 | 3 | 2019-08-28T11:20:40Z |
问题
我想要选择具有最新“expire_at”的用户。
参考:https : //stackoverflow.com/a/2111420/5588637 后,我尝试了以下操作:
SELECT
u.*,
m1.*
FROM
users u
INNER JOIN memberships m1 ON u.id = m1.user_id
LEFT JOIN memberships m2 ON u.id = m2.user_id
AND (
m1.expire_at < m2.expire_at
OR m1.expire_at = m2.expire_at
AND m1.id < m2.id
)
WHERE
m2.id IS NULL;
结果
的id,因为我曾经将出现两次join。
| id | name | age | id | user_id | expire_at |
|----|------------|-----|----|---------|----------------------|
| 1 | Apple | 22 | 1 | 1 | 2019-08-17T11:19:30Z |
| 2 | Strawberry | 23 | 3 | 2 | 2019-08-29T11:20:19Z |
| 3 | Orange | 50 | 5 | 3 | 2019-08-28T11:20:40Z |
更改 m1.*为 后m1.expire_at。我得到了我想要的结果。
| id | name | age | expire_at |
|----|------------|-----|----------------------|
| 1 | Apple | 22 | 2019-08-17T11:19:30Z|
| 2 | Strawberry | 23 | 2019-08-29T11:20:19Z |
| 3 | Orange | 50 | 2019-08-28T11:20:40Z |
在线试用:http : //sqlfiddle.com/#!9/27fa22/4
在 Lavavel 中实现
Laravel 框架版本:5.6.39
比较结果,Laravel 结果缺少第二个 id,即成员资格表 id,我想这是结果不正确的原因。
我在网上搜了一下,好像是这个问题。 https://github.com/laravel/framework/issues/4962
但是经过各种尝试我都失败了......
德玛西亚99
肥皂起泡泡