0

由于不断变化的需求,我重新审视了几个月前创建的界面。更多功能,更多数据。我在这里收到了有关数据的棘手排序要求的帮助。但是需求已经改变,或者更准确地说,是扩展了。我已经修补了几个小时,但没有成功。我希望SO能够再次帮助我摆脱困境。

这是一些出现在数据库中的简化示例数据,以及我需要如何订购它。

                **原始** **想要的**

╔════╦════════╦═══════════╦═══════════╗╔════╦═════ ═══╦═══════════╦═══════════╗
║ id ║ job_id ║ action_id ║ 迭代 ║ ║ id ║ job_id ║ action_id ║ 迭代 ║
╠════╬════════╬═══════════╬═══════════╣╠════╬═════ ═══╬═══════════╬═══════════╣
║ 1 ║ 1 ║ 1 ║ 0 ║ ║ 14 ║ 6 ║ 1 ║ 0 ║
║ 2 ║ 1 ║ 2 ║ 0 ║ ║ 16 ║ 6 ║ 2 ║ 0 ║
║ 3 ║ 2 ║ 1 ║ 0 ║ ║ 12 ║ 1 ║ 1 ║ 1 ║
║ 4 ║ 3 ║ 1 ║ 0 ║ ║ 13 ║ 1 ║ 2 ║ 1 ║
║ 5 ║ 4 ║ 1 ║ 0 ║ ║ 15 ║ 1 ║ 3 ║ 1 ║
║ 6 ║ 3 ║ 2 ║ 0 ║ ║ 8 ║ 5 ║ 1 ║ 0 ║
║ 7 ║ 3 ║ 3 ║ 0 ║ ║ 10 ║ 5 ║ 2 ║ 0 ║
║ 8 ║ 5 ║ 1 ║ 0 ║ ║ 11 ║ 5 ║ 3 ║ 0 ║
║ 9 ║ 4 ║ 2 ║ 0 ║ ║ 5 ║ 4 ║ 1 ║ 0 ║
║ 10 ║ 5 ║ 2 ║ 0 ║ ║ 9 ║ 4 ║ 2 ║ 0 ║
║ 11 ║ 5 ║ 3 ║ 0 ║ ║ 4 ║ 3 ║ 1 ║ 0 ║
║ 12 ║ 1 ║ 1 ║ 1 ║ ║ 6 ║ 3 ║ 2 ║ 0 ║
║ 13 ║ 1 ║ 2 ║ 1 ║ ║ 7 ║ 3 ║ 3 ║ 0 ║
║ 14 ║ 6 ║ 1 ║ 0 ║ ║ 3 ║ 2 ║ 1 ║ 0 ║
║ 15 ║ 1 ║ 3 ║ 1 ║ ║ 1 ║ 1 ║ 1 ║ 0 ║
║ 16 ║ 6 ║ 2 ║ 0 ║ ║ 2 ║ 1 ║ 2 ║ 0 ║
╚════╩════════╩═══════════╩═══════════╝╚════╩═════ ═══╩═══════════╩═══════════╝
                **解释**

╔════╦════════╦═══════════╦═══════════╗
║ id ║ job_id ║ action_id ║ 迭代 ║
╠════╬════════╬═══════════╬═══════════╣订购:
║ 14 ║ 6 ║ 1 ║ 0 ║
║ 16 ║ 6 ║ 2 ║ 0 ║ action_id 为 1 的最大 id
╠════╬════════╬═══════════╬═══════════╣后面是所有的行
║ 12 ║ 1 ║ 1 ║ 1 ║ 相同的 job_id 和迭代次数
║ 13 ║ 1 ║ 2 ║ 1 ║ 第一个,按升序排列
║ 15 ║ 1 ║ 3 ║ 1 ║ action_id。
╠════╬════════╬═══════════╬═══════════╣
║ 8 ║ 5 ║ 1 ║ 0 ║ 然后是下一个最大的id
║ 10 ║ 5 ║ 2 ║ 0 ║ action_id = 1 等。
║ 11 ║ 5 ║ 3 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 5 ║ 4 ║ 1 ║ 0 ║
║ 9 ║ 4 ║ 2 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 4 ║ 3 ║ 1 ║ 0 ║
║ 6 ║ 3 ║ 2 ║ 0 ║
║ 7 ║ 3 ║ 3 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 3 ║ 2 ║ 1 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 1 ║ 1 ║ 1 ║ 0 ║
║ 2 ║ 1 ║ 2 ║ 0 ║
╚════╩════════╩═══════════╩═══════════╝

我目前正在使用ORDER BY这样的:

SELECT *
FROM reports as r
ORDER BY
    FIND_IN_SET(r.job_id, ( SELECT GROUP_CONCAT(job_id ORDER BY id DESC)
                            FROM reports
                            WHERE action_id = 1)),
    r.action_id

但它没有考虑迭代。我看不出我可以把那一点逻辑放在哪里。有人可以提供任何帮助吗?

非常感谢!

4

1 回答 1

1

有趣但没那么复杂.. 只需要使用自联接和子选择。另外,我认为 order by 现在更容易阅读。

http://sqlfiddle.com/#!2/7f9d2/1/0

SELECT r.id, r.job_Id, r.action_id, r.iteration,  r2.mid, r2.job_Id
FROM raw r
INNER JOIN (SELECT max(ID) mID, Job_ID, iteration 
           FROM raw 
           WHERE action_ID=1 
           GROUP BY Job_Id, iteration) r2
 on R.Job_Id = R2.Job_ID
 and R.Iteration = R2.iteration
ORDER BY r2.mid desc, iteration, r.action_Id

这里的关键是首先将您概述的组放在一起。通过进行子选择以获取每个组中的最大 ID,然后将这些组加入到基本集,然后根据自加入/子查询中的最大 ID 应用排序......以及你的其他逻辑......你得到你所追求的。

从集合的角度考虑 SQL,这种排序会变得更容易。

您需要一组数据来定义每个组的组和最大值(我的内联视图)。那么您需要根据子集中的最大值进行排序,迭代,然后是主集中的操作。

我使用了左连接,以防当我将它移植到小提琴时某些数据被弄乱了,但内部应该也能正常工作。

于 2014-12-12T18:08:36.383 回答