【问题标题】:Sort order for two tables using group by使用 group by 对两个表进行排序
【发布时间】:2018-09-11 18:21:21
【问题描述】:

我有两个表,事件和版本。一个事件有多个版本。我想执行内部连接并获得每个事件的最新版本。 (原来的问题在这里:Join two tables and apply group by, but change sort order

我已将表格更改为此。我认为这更有意义。但我处于同样的情况,我不明白如何获取每个事件的最大版本 ID。我想了解解决方案背后的逻辑。随时给我关于表结构的反馈。谢谢!

查询:

SELECT e.id AS event_id,v.* 
FROM events.event e
INNER JOIN events.version v
ON (v.event_id = e.id)
GROUP BY v.event_id

活动

Id   Updated
1    03/08/18
2    06/06/18

版本

Id Event_id      Name            Description        
7  1             Dinner          Dinner Z           
8  2             Breakfast       Breakfast Y   
9  2             Breakfast       Breakfast X

【问题讨论】:

  • select max(v.id),v.*,e.* from EVENT as e inner join VERSION as v on e.Id=v.Event_id group by v. Event_id 试试查询,我认为它工作正常。

标签: mysql sorting join group-by sql-order-by


【解决方案1】:

假设事件中的最后一个版本的特征是具有最大的ID 值,我们可以尝试以下查询:

SELECT
    e.id AS event_id,
    v1.*
FROM event e
INNER JOIN version v1
    ON e.id = v1.event_id
INNER JOIN
(
    SELECT event_id, MAX(id) AS max_id
    FROM version
    GROUP BY event_id
) v2
    ON v1.event_id = v2.event_id AND
       v1.id = v2.max_id;

您会注意到上述查询中的第一个连接就是您已经在执行的操作。我只是在一个新的子查询中添加了一个连接,它可以找到每个版本的最新事件。

【讨论】:

  • 工作完美! (只有“ON e.id. = v1.event_id”的语法错误。id 后面的点)
【解决方案2】:
select max(v.id),v.*,e.* from EVENT as e inner join VERSION as v on e.Id=v.Event_id group by v. Event_id

尝试查询,我认为它工作正常。

【讨论】:

  • 使用此查询,不能保证为v.* 返回的值将来自找到最大v.id 值的相同 行。由于 GROUP BY 的 MySQL 特定扩展,此查询模式在 MySQL 中执行,此时 sql_mode 中省略了 ONLY_FULL_GROUP_BYdev.mysql.com/doc/refman/5.7/en/group-by-handling.html(不注意警告,这个查询示例对试图学习/理解 SQL 的人来说是个坏建议)
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多