MySQL 按另一个 table 的最后一行排序
MySQL Order by another table's last row
我有 2 个 table,我想在其中获取 table A 的内容,但从 table B 的值中排序。我按 3 个值排序(已解决,reply_date,然后是日期)。但我的问题是它没有从 table B 中取出最后一行,所以结果不是我所期望的。这是我到目前为止的查询。
SELECT user_tickets.user_ticket_id, user_tickets.user_id, solved, subject, user_tickets.date AS date, user_tickets_replies.date AS reply_date
FROM user_tickets
INNER JOIN user_tickets_replies ON user_tickets.user_ticket_id=user_tickets_replies.user_ticket_id && user_tickets.user_id = user_tickets_replies.user_id
GROUP BY user_tickets.user_ticket_id
ORDER BY solved ASC, reply_date DESC, date DESC
LIMIT 200
如何从 user_tickets_replies 获取最后一个 reply_date?
如果我没理解错的话,你有很多工单,有些工单有不止一个回复。您希望按最新(最近)排序reply_date
,但您发现排序不正确。
我可以想到两种方法来解决这个问题,具体取决于您是希望查询 return 给定票证的所有 reply_date
还是仅查询最近的票证。第一个选项是更改 ORDER BY
:
ORDER BY solved ASC, MAX(user_tickets_replies.date) DESC, user_tickets.date DESC
这会使 reply_date
列保持其当前状态,但仅使用最大日期进行排序。
第二个是改变你的SELECT
:
SELECT ..., MAX(user_tickets_replies.date) AS reply_date
这会将 reply_date
列更改为在 user_tickets
中每行包含一个值,而不是在 user_tickets_replies
中每行包含一个值。
最后回复日期应该是Max(user_tickets_replies.date)吧?
我会加入一个子 select 只是您要作为排序依据的数据。
inner join (SELECT user_ticket_id, max(date) as reply_date FROM user_tickets_replies group by 1 order by 2 desc limit 200) sorted_tickets
然后
order by sorted_tickets.reply_date
感谢您的所有回答,但我最终使用了 PHP。使用此查询获取所有门票:
SELECT user_ticket_id, user_id, solved, subject, date FROM user_tickets ORDER BY solved ASC, date DESC LIMIT 200
然后将所有数据添加到一个数组中并按此排序:
usort($tickets, function($a, $b) {
$solved = $a['solved'] - $b['solved'];
if ($solved) return $solved;
return $a['replied'] > $b['replied'];
});
我有 2 个 table,我想在其中获取 table A 的内容,但从 table B 的值中排序。我按 3 个值排序(已解决,reply_date,然后是日期)。但我的问题是它没有从 table B 中取出最后一行,所以结果不是我所期望的。这是我到目前为止的查询。
SELECT user_tickets.user_ticket_id, user_tickets.user_id, solved, subject, user_tickets.date AS date, user_tickets_replies.date AS reply_date
FROM user_tickets
INNER JOIN user_tickets_replies ON user_tickets.user_ticket_id=user_tickets_replies.user_ticket_id && user_tickets.user_id = user_tickets_replies.user_id
GROUP BY user_tickets.user_ticket_id
ORDER BY solved ASC, reply_date DESC, date DESC
LIMIT 200
如何从 user_tickets_replies 获取最后一个 reply_date?
如果我没理解错的话,你有很多工单,有些工单有不止一个回复。您希望按最新(最近)排序reply_date
,但您发现排序不正确。
我可以想到两种方法来解决这个问题,具体取决于您是希望查询 return 给定票证的所有 reply_date
还是仅查询最近的票证。第一个选项是更改 ORDER BY
:
ORDER BY solved ASC, MAX(user_tickets_replies.date) DESC, user_tickets.date DESC
这会使 reply_date
列保持其当前状态,但仅使用最大日期进行排序。
第二个是改变你的SELECT
:
SELECT ..., MAX(user_tickets_replies.date) AS reply_date
这会将 reply_date
列更改为在 user_tickets
中每行包含一个值,而不是在 user_tickets_replies
中每行包含一个值。
最后回复日期应该是Max(user_tickets_replies.date)吧?
我会加入一个子 select 只是您要作为排序依据的数据。
inner join (SELECT user_ticket_id, max(date) as reply_date FROM user_tickets_replies group by 1 order by 2 desc limit 200) sorted_tickets
然后
order by sorted_tickets.reply_date
感谢您的所有回答,但我最终使用了 PHP。使用此查询获取所有门票:
SELECT user_ticket_id, user_id, solved, subject, date FROM user_tickets ORDER BY solved ASC, date DESC LIMIT 200
然后将所有数据添加到一个数组中并按此排序:
usort($tickets, function($a, $b) {
$solved = $a['solved'] - $b['solved'];
if ($solved) return $solved;
return $a['replied'] > $b['replied'];
});