Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Groupwise Maximum - Fatal编程技术网

从MySql中的列中选择不同的值

从MySql中的列中选择不同的值,mysql,sql,select,group-by,groupwise-maximum,Mysql,Sql,Select,Group By,Groupwise Maximum,假设我有一个名为items的表: sender_id receiver_id goods_id price 2 1 a1 1000 3 1 b2 2000 2 1 c1 5000 4 1 d1 700 2 1 b1 500 在这里,我想从items表中

假设我有一个名为items的表:

sender_id receiver_id goods_id price
  2            1          a1   1000
  3            1          b2   2000
  2            1          c1   5000
  4            1          d1   700
  2            1          b1   500   
在这里,我想从items表中按价格降序选择sender_id、goods_id,这样就不会出现多次包含相同sender_id值的行sender_id 2。我使用了以下查询,但没有成功:

select distinct sender_id,goods_id from items where receiver_id=1 order by price desc
结果显示,所有包含sender_id 2的元组的五个元组记录按时间降序显示了三次,但我只想显示三条记录,其中一条记录的sender_id为2,最高价格仅为5000。我该怎么办? 我的预期产出是:

sender_id goods_id
   2         c1
   3         b2
   4         d1

获得每组中的最高价格,您可以按以下方式操作:

SELECT T1.*
FROM (
    SELECT
     MAX(price) AS max_price,
     sender_id
    FROM items
    GROUP BY sender_id
) AS T2
INNER JOIN items T1 ON T1.sender_id = T2.sender_id AND T1.price = T2.max_price
WHERE T1.receiver_id=1 
ORDER BY T1.price
您可以这样使用。

试试这个:

SELECT i.sender_id, i.goods_id 
FROM items i 
INNER JOIN (SELECT i.sender_id, MAX(i.price) AS maxPrice
            FROM items i WHERE i.receiver_id=1 
            GROUP BY i.sender_id
           ) AS A ON i.sender_id = A.sender_id AND i.price = A.maxPrice
WHERE i.receiver_id=1

请试试这个

select sender_id,goods_id from items t1
where not exists (select 1 from items t2
                  where t2.sender_id = t1.sender_id
                    and t2.receiver_id = t1.receiver_id
                    and t2.price > t1.price)
 and receiver_id = 1
order by price desc

你能发布上表的预期输出吗?我已经编辑了我的问题@ling.sw你为什么以接收者身份获得价格?对不起@ling.s我更正了它!您不希望在预期输出中使用商品id而不是接收器id吗?第二部分给出输出,但第一部分给出错误,无论如何,感谢我的投票@罗斯玛丽,非常欢迎你。。。检查更新的答案。现在两个查询都可以工作了。我在MAXprice后面加了逗号作为MAXprice,这是一个打字错误。我已经改正了。我喜欢先用,谢谢!已更正,但第一部分未给出预期输出。不管怎样,哪种方法在速度方面更好@萨哈什Shah@rosemary据我所知,JOIN是比任何其他方法都好的方法。我更喜欢使用Join的第一种方法。我不理解“从项目中选择1”中“1”的用法。。。。你能给我一些建议吗@你可以在那里选择任何东西。因为exists检查该选择是否返回任何行。Not Exists确保子查询中没有ID与t1相同且价格更高的行。您可以选择1或选择2或选择0或选择发件人id。因此,查询基本上是说,如果不存在具有相同ID和更高价格的行,那么@tin tran我们也可以使用*而不是1、0或2。。?但那只是一个开销,对吗?
SELECT i.sender_id, i.goods_id 
FROM (SELECT i.sender_id, i.goods_id 
      FROM (SELECT i.sender_id, i.goods_id 
            FROM items i WHERE i.receiver_id=1 
            ORDER BY i.sender_id, i.price DESC
           ) AS i 
      GROUP BY i.sender_id
     ) AS i
select sender_id,goods_id from items t1
where not exists (select 1 from items t2
                  where t2.sender_id = t1.sender_id
                    and t2.receiver_id = t1.receiver_id
                    and t2.price > t1.price)
 and receiver_id = 1
order by price desc