如何在mysql中选择项目的最新排名

如何在mysql中选择项目的最新排名,mysql,select,Mysql,Select,我有两张桌子:硬币和硬币历史 硬币桌 硬币历史表;每枚硬币在日期上的等级 |id | coin_id | rank | date | +---+---------+--------+----------+ | 1 | 1 | 1 |01-02-2018| | 2 | 1 | 1 |02-02-2018| | 3 | 1 | 1 |04-02-2018| | 4 | 2 | 2 |01-02-20

我有两张桌子:硬币和硬币历史

硬币桌

硬币历史表;每枚硬币在日期上的等级

|id | coin_id | rank   | date     | 
+---+---------+--------+----------+
| 1 |    1    |   1    |01-02-2018|
| 2 |    1    |   1    |02-02-2018|
| 3 |    1    |   1    |04-02-2018|
| 4 |    2    |   2    |01-02-2018|
| 5 |    2    |   3    |02-02-2018|
| 6 |    2    |   2    |04-02-2018|
| 7 |    3    |   3    |01-02-2018|
| 8 |    3    |   2    |02-02-2018|
| 9 |    3    |   4    |04-02-2018|
|10 |    4    |   4    |01-02-2018|
|11 |    4    |   4    |02-02-2018|
|12 |    4    |   3    |04-02-2018|
我想从硬币历史中按最新等级订购的硬币中获得每一枚硬币

这一结果与某些因素有关:

|coin_id | symbol |  rank  |
+--------+--------+--------+
|   1    |  BTC   |   1    |
|   2    |  ETH   |   2    |
|   4    |  BCH   |   3    |
|   3    |  XRP   |   4    |
我尝试过一些查询,但都会导致此错误

这与sql\u mode=only\u full\u group\u by不兼容

在a中,从特定硬币的历史记录中获取日期的最大值。 将此结果集与主表连接起来,只获取与硬币最近日期对应的行。 最后,使用ORDER BY以排名的升序获得结果。 尝试:

在a中,从特定硬币的历史记录中获取日期的最大值。 将此结果集与主表连接起来,只获取与硬币最近日期对应的行。 最后,使用ORDER BY以排名的升序获得结果。 尝试:


MySQL还有一个更简单的方法,但它只是MySQL,所以在代码中需要数据库可移植性时不要使用它

使用GROUP_CONCAT和嵌套的SUBSTRING_INDEX函数来获取第一个元素/项,也可以用于获取一个额外的列,该列保留正确的分组信息

注意:设置会话组\u concat\u max\u len=@@max\u allowed\u数据包;使用时非常重要,否则组_CONCAT将仅显示1024字节

质疑

结果


MySQL还有一个更简单的方法,但它只是MySQL,所以在代码中需要数据库可移植性时不要使用它

使用GROUP_CONCAT和嵌套的SUBSTRING_INDEX函数来获取第一个元素/项,也可以用于获取一个额外的列,该列保留正确的分组信息

注意:设置会话组\u concat\u max\u len=@@max\u allowed\u数据包;使用时非常重要,否则组_CONCAT将仅显示1024字节

质疑

结果


从coin_历史中选择coin_id、MAXdate作为max_日期不应该按coin从coin_历史组中选择coin_id、MAXdate作为max_日期吗_id@Hadu请使用更新的答案。有一个代码输入错误。硬币历史记录中的SELECT coin_id、MAXdate作为max_日期不应该是硬币历史记录组中的SELECT coin_id、MAXdate作为max_日期吗_id@Hadu请使用更新的答案。存在代码输入错误[42000][1055],选择列表的表达式1不在GROUP BY子句中,并且包含功能上不依赖GROUP BY子句中的列的非聚合列“q.id”;这与sql_mode=only_full_group_by[42000][1055]SELECT list的表达式1不在group by子句中并且包含功能上不依赖group by子句中的列的未聚合列“q.id”不兼容;这与sql\u mode=only\u full\u group\u By不兼容。此处的“注释”部分无法显示结果,但秩被视为字符串,排序不被视为字符串correct@Hadu我的结果与你在问题中的预期结果相同。因为问题中的所有等级都是一位数,如果你有两位数的等级编号,字符串排序将给您错误的结果如果您有两位数的排名编号,字符串排序将给您错误的结果确实会发生。。我不明白你的第一句话是什么意思@Hadu你可以用CAST将字符串转换成int。。请参阅此处的“注释”部分中无法显示结果,但排名被视为字符串,排序不被视为字符串correct@Hadu我的结果与你在问题中的预期结果相同。因为问题中的所有等级都是一位数,如果你有两位数的等级编号,字符串排序将给您错误的结果如果您有两位数的排名编号,字符串排序将给您错误的结果确实会发生。。我不明白你的第一句话是什么意思@Hadu你可以用CAST将字符串转换成int。。看见
|coin_id | symbol |  rank  |
+--------+--------+--------+
|   1    |  BTC   |   1    |
|   2    |  ETH   |   2    |
|   4    |  BCH   |   3    |
|   3    |  XRP   |   4    |
SELECT 
  c.coin_id, 
  c.symbol, 
  ch.rank 
FROM 
  coins AS c 
JOIN 
  coin_history AS ch 
    ON ch.coin_id = c.coin_id 
JOIN 
  (
   SELECT coin_id, 
          MAX(date) AS max_date 
   FROM coin_history 
   GROUP BY coin_id 
  ) AS dt 
    ON ch.coin_id = dt.coin_id AND 
       ch.date = dt.max_date
ORDER BY ch.rank
SET SESSION group_concat_max_len = @@max_allowed_packet;

SELECT 
   coins.id AS coin_id
 , coins.symbol
 , CAST( 
      SUBSTRING_INDEX(
        SUBSTRING_INDEX(
           GROUP_CONCAT(coin_history.rank ORDER BY coin_history.date DESC)
         , ','
         , 1
        )
        , ','
       , -1
   ) AS UNSIGNED) AS rank
FROM 
 coins
INNER JOIN
 coin_history
ON
 coins.id = coin_history.coin_id

GROUP BY 
   coins.id
 , coins.symbol

ORDER BY 
 rank
| coin_id | symbol | rank |
| ------- | ------ | ---- |
| 1       | BTC    | 1    |
| 2       | ETH    | 2    |
| 4       | BCH    | 3    |
| 3       | XRP    | 4    |
SELECT q.*from
  (SELECT h.*, c.symbol
   FROM `coin_history` AS h
   JOIN coins AS c ON h.coin_id = c.id
   ORDER BY h.date DESC
   LIMIT 50) AS q
GROUP BY q.coin_id
ORDER BY q.rank ASC