如何在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