Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:按多列分组时选择第一行或最后一行_Mysql_Sql_Select_Group By_Distinct - Fatal编程技术网

MySQL:按多列分组时选择第一行或最后一行

MySQL:按多列分组时选择第一行或最后一行,mysql,sql,select,group-by,distinct,Mysql,Sql,Select,Group By,Distinct,我有一个SQL表,其中包含一些商品的销售数据。事实上,它有物品销售的记录 例如,有一个销售包含两个项目:键盘(id:1)和鼠标(id:2)。买家可以对每件商品进行多次出价,就像ebay一样。因此,让我们假设有两位买家(ID分别为97和98)多次出价。相关数据如下: bid_id | buyer_id | item_id | amount | time | 1 | 97 | 1 |

我有一个SQL表,其中包含一些商品的销售数据。事实上,它有物品销售的记录

例如,有一个销售包含两个项目:键盘(
id:1
)和鼠标(
id:2
)。买家可以对每件商品进行多次出价,就像ebay一样。因此,让我们假设有两位买家(ID分别为97和98)多次出价。相关数据如下:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   44.26       |   2014-01-20 15:53:16 |
2       |   98          |   2       |   30.47       |   2014-01-20 15:54:52 |
3       |   97          |   2       |   40.05       |   2014-01-20 15:57:47 |
4       |   97          |   1       |   42.46       |   2014-01-20 15:58:36 |
5       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
6       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
7       |   98          |   2       |   28          |   2014-01-20 16:08:42 |
8       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |
在这个表中,我需要为每个用户的第一个项目报价和最后一个报价选择数据

因此,如果我为每个用户选择第一项优惠(不同),返回数据应该如下所示:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   44.26       |   2014-01-20 15:53:16 |
2       |   98          |   2       |   30.47       |   2014-01-20 15:54:52 |
3       |   97          |   2       |   40.05       |   2014-01-20 15:57:47 |
bid_id  |   buyer_id    |   item_id |   amount      |   time                |
5       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
6       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
8       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |
如果我为每个用户选择last offers,返回值应如下所示:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   44.26       |   2014-01-20 15:53:16 |
2       |   98          |   2       |   30.47       |   2014-01-20 15:54:52 |
3       |   97          |   2       |   40.05       |   2014-01-20 15:57:47 |
bid_id  |   buyer_id    |   item_id |   amount      |   time                |
5       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
6       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
8       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |
由于我必须为每个用户带来每个项目,我尝试对
买家id
项目id
进行
分组,然后
选择
时间
投标id
MIN
值。但它总是首先返回我的
bid\u id
,然后返回最新的
amount
行(实际上是最后的报价)

以下是我尝试的查询:

SELECT MIN(`bid_id`) AS `bid_id`,`buyer_id`,`item_id`,`amount`,`time` FROM `offers` GROUP BY `buyer_id`,`item_id`
结果是:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
2       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
3       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |
如您所见,它按分组,ID是正确的,但行的其余值不是正确的

如何在分组购买多列时正确选择第一行和/或最后一行?

第一行提供sql:

SELECT o.`bid_id`,o.`buyer_id`,o.`item_id`,o.`amount`,o.`time` FROM `offers` o
JOIN
(SELECT MIN(`bid_id`) AS `bid_id`,`buyer_id`,`item_id`,`amount`,`time` FROM `offers` GROUP BY `buyer_id`,`item_id`)x
ON x.bid_id=o.bid_id  AND x.buyer_id=o.buyer_id
SELECT
*
FROM
    offers AS o1
WHERE
NOT EXISTS (
    SELECT
        1
    FROM
        offers o2
    WHERE
        o1.buyer_id = o2.buyer_id
    AND o1.item_id = o2.item_id
    AND datetime(o1.time) > datetime(o2.time)
)

last提供sql:只需更改为datetime(o1.time)下面是另一个例子,使用

对于第一次投标:

SELECT x.bid_id, x.buyer_id, x.item_id, x.amount, x.time 
FROM 
(
  SELECT o.bid_id, o.buyer_id, o.item_id, o.amount, o.time, 
    @combo :=CASE WHEN NOT(@curItem = o.item_id AND @curBuyer = o.buyer_id) 
                  THEN 1 ELSE @combo+1 END AS Rank,
    @curItem:=o.item_id AS item,
    @curBuyer:=o.buyer_id AS buyer
  FROM
  (
    SELECT o.bid_id, o.buyer_id, o.item_id, o.amount, o.time 
      FROM offers o
      ORDER BY o.buyer_id, o.item_id, o.bid_id
  ) o,
  (SELECT @curItem := -1) itm,
  (SELECT @curBuyer:= -1) buy
) x
WHERE x.Rank = 1;
对于最后一次投标查询,您只需将
ORDER BY
更改为
o.buyer\u id,o.item\u id,o.bid\u id DESC


请尝试下面的查询以获得所需的输出。 SQL FIDDLE链接: