MySQL最近一年限制并使用JOIN

时间:2013-01-14 18:01:24

标签: mysql

我有以下代码,我想只选择最近的记录(因此我写了max(a.fiscal_year),除了查询每个会计年度返回。我如何调整以下查询只返回最近(最高)财政年度。

SELECT count(*), b.auditor_name, c.pubco_name, max(a.fiscal_year), a.month
FROM a_fees_view a, a_auditor b, a_pubco c
WHERE a.auditor_id = b.auditor_id AND a.pubco_id = c.pubco_id
GROUP BY a.auditor_id, a.pubco_id, a.fiscal_year
ORDER BY b.auditor_name, c.pubco_name, a.fiscal_year

此外,我想从a_pubco表中选择 ALL pubcos,而不仅仅是a_fees_view表中也存在的那个。如何调整上面的查询以包括a_fees_view表和a_pubco表中的所有pubco。

1 个答案:

答案 0 :(得分:0)

此问题的第一部分是Top-N(或Groupwise-max)查询。通常的语法如下:

SELECT x.*
  FROM my_table x
  JOIN (SELECT grouping_id, MAX(other_field) max_other_field FROM my_table GROUP BY grouping_id) y
    ON y.grouping_id = x.grouping_id
   AND y.max_other_field = x.other_field;

考虑以下示例(受其他地方提出的问题的启发):

我有一个showjumping事件的结果表。我想知道每匹马最擅长的事情(以及他们取得的成果)。

SELECT * FROM events;
+----------+----------+-------+
| Event_id | Horse_id | Place |
+----------+----------+-------+
|      601 |      101 |     1 |
|      601 |      102 |     2 |
|      601 |      201 |     3 |
|      601 |      301 |     4 |
|      602 |      201 |     2 |
|      603 |      201 |     3 |
|      701 |      101 |     1 |
|      801 |      301 |     2 |
|      901 |      102 |     7 |
+----------+----------+-------+

从检查中我可以看出,马101的最佳成绩是她在两个赛事中取得的'第一',所以我希望这两行都能归还。 马102的最好成绩是'第二',马201和马301。但是如何构建一个告诉我们的查询呢?方法如下:

SELECT x.*
  FROM events x
  JOIN (SELECT horse_id,MIN(place) min_place FROM events GROUP BY horse_id) y
    ON y.horse_id = x.horse_id AND y.min_place = x.place;
+----------+----------+-------+
| Event_id | Horse_id | Place |
+----------+----------+-------+
|      601 |      101 |     1 |
|      601 |      102 |     2 |
|      602 |      201 |     2 |
|      701 |      101 |     1 |
|      801 |      301 |     2 |
+----------+----------+-------+