带有内连接的SQL max()

时间:2014-05-30 21:27:22

标签: mysql sql greatest-n-per-group

我正在创建一个拍卖网站。在这里,人们可以寻找物品并在其上下注。在用户帐户区域中,我希望有一个列表,显示用户已投标的所有项目。

当然,每个项目可以有来自不同用户的多个投注,因此我只想展示金额最高的投注。这样,用户就可以关注他出价的所有项目,并可以跟踪他是否仍然是最高金额的项目。

这就是我的数据库的样子:

Tabel item                      Tabel itembid                          Tabel user
+=========================+     +================================+     +==============+
|id | title | description |     |id | item_id | user_id | amount |     |id | username |
+=========================+     +================================+     +==============+
| 1 | item1 | ........... |1   *| 1 |    1    |    2    |   10   |*   1| 1 |    me    |
| 2 | item2 | ........... |-----| 2 |    1    |    1    |   15   |-----| 2 |  myself  |
| 3 | item3 | ........... |     | 3 |    2    |    3    |   5    |     | 3 |    I     |
+=========================+     | 4 |    2    |    1    |   10   |     +==============+
                                +================================+

如上所示,我有3个表(item,itembid和user)。正如您所看到的,用户'我'已经进行了2次出价,一次出现在第1项上,一次出现在第2项上。事实证明,他目前也是两个出价最高的出价。

现在,用户'我自己'在item1之前出价,'我'对item2进行了出价。但是,它们不再是出价最高的用户(用户'我')。现在我需要一个SQL语句,它给我一个信息列表(标题,描述,金额,用户名),这是我曾经出价的所有项目的列表。如果我是目前该项目出价最高的人,我需要查看该项目的标题和说明以及我为我的投注金额以及我的用户名。现在,如果我不是出价最高的人,我仍然希望看到该项目的信息,但现在要查看出价最高者的数量和用户名。

这是一个例子,从用户'我'的角度来看,我想看看:

> item1, 15, me
> item2, 10, me

现在,对于用户'我自己',我希望看到:

> item1, 15, me

(因为'我'曾经对item1出价,但不再是金额最高的那个,用户'我'是)

这是我到目前为止所做的,但是工作安静得不好......

SELECT i.title, i.description, ib.amount, u.username
FROM item i
INNER JOIN itembid ib ON i.id = ib.item_id
INNER JOIN user u ON ib.user_id = u.id
WHERE ib.amount = (SELECT max(amount) FROM itembid ib2 WHERE ib2.id = ib.id)
AND ib.user_id = 1

1 个答案:

答案 0 :(得分:2)

这是:

SELECT i.title, bmax.amount, u.username
FROM itembid AS b
JOIN (SELECT item_id, MAX(amount) AS amount
      FROM itembid
      GROUP BY item_id) AS bmax
    ON b.item_id = bmax.item_id AND b.amount = bmax.amount
JOIN item AS i ON i.id = b.item_id
JOIN itembid AS ubid ON ubid.item_id = i.item_id
JOIN user AS u ON u.id = b.user_id
WHERE ubid.user_id = :current_user