我必须根据动画索引的AniDB ID对其分组,并根据文件自动增量ID以降序显示这些值。

这是我目前所做的:

SELECT
f.id, f.category, f.anidb, f.mal_id, COUNT( * ) AS dupes, f.filename,
a.titles, a.synopsis, a.episodes, a.image, a.rating,
c.name as cat_name, c.id as categoryid
  FROM table_files f
      LEFT JOIN table_anidb a ON a.id = f.anidb
      LEFT JOIN table_categories c ON c.id = f.category
      GROUP BY a.id ORDER BY f.id DESC


问题:


我有火影忍者8集。第8集的ID为204。而ep.1的ID为160。查询返回如下:

id  |   anidb   |   filename    |   dupes   |   cat_name
--------------------------------------------------------
201 |   8692    |   SAO         |   1       |   Series
200 |   9251    |   RYO         |   1       |   Movie
.....
.......
160 |   239     |   Naruto ep.1 |   8       |   Series


但我希望将火影忍者第8集显示在结果的顶部,而不是最后一集。
如何使用OR逻辑同时将anidb和mal_id分组?这样,即使没有提供任何anidb ID,也可以进行分组。

最佳答案

广告。 1。

由于idanidbfilename都在一个表中,所以恐怕您无法摆脱进行子查询联接的麻烦:

SQLFiddle

SELECT f.id, f.anidb, f.filename
FROM files f
JOIN
  (SELECT MAX(id) as id FROM files GROUP BY anidb) AS f2
  ON f2.id = f.id
ORDER BY f.id DESC


(为了便于阅读,对数据进行了扁平化处理,但是您可以得到一般的想法)

广告。 2。

至于第二个问题,您实际上只需要向上面连接的子查询添加第二个分组列:

SQLFiddle

SELECT f.id, f.anidb, f.mal_id, f.filename
FROM files f
JOIN
  (SELECT MAX(id) as id FROM files GROUP BY anidb, mal_id) AS f2 on f2.id = f.id
ORDER BY f.id DESC


NULL彼此不同(例如NULL!= NULL),因此不用担心分组会将所有空的anidb行融为一体。

10-07 16:52
查看更多