MySQL - 由于链接到主表的多个记录,查询不遵守字母顺序

问题描述 投票:0回答:1

我有一个图书目录数据库。每本书可以有一个或多个作者。

示例:约翰·雷德 (John Red) 所著的第 1 本书;第 2 本书,作者:弗雷德·格林 (Fred Green) 和史蒂夫·布鲁 (Steve Blue);第 3 本书,作者:Ben Brown。

文章表

id 标题
1 书1
2 书2
3 书3

作者表

id 姓氏 名字
1 红色 约翰
2 绿色 弗雷德
3 蓝色 史蒂夫
4 棕色

AUTHORS_ARTICLES 表

id_作者 id_文章
1 1
2 2
3 2
4 3

我需要检索书籍的详细信息,按作者的字母顺序排序。

我正在使用以下查询:

SELECT DISTINCT a.*
FROM (articles a LEFT OUTER JOIN authors_articles aa ON a.id = aa.id_article) 
LEFT OUTER JOIN authors au ON aa.id_author = au.id
ORDER BY au.surname ASC, au.name ASC 

问题在于书籍并不总是按作者姓氏/姓名的字母顺序排序:当一本书有两个或多个作者时,出现在链接表(authors_articles)中的第一个作者将是从查询返回的作者,这不一定是按字母顺序排列的第一个。尽管如此,它仍将被查询末尾的 ORDER BY 子句使用,从而导致记录顺序错误。

在我的示例中,结果是:

id 标题
3 书3
2 书2
1 书1

因此,即使 Book2 是 Green AND Blue 的作者,Brown 的书也排在第一位。

我需要将它们列为 Book2、Book3 和 Book1。 任何帮助将不胜感激。

mysql sorting
1个回答
0
投票

您需要先找到每本书的第一位作者,然后才能执行订单。可以使用一个简单的

row_number
查询来实现:

with cte as (
  select
    articles.*,
    authors.surname,
    authors.name,
    row_number() over (
      partition by articles.id
      order by authors.surname, authors.name
    ) as rn
  from articles
  left join authors_articles on articles.id =  authors_articles.id_article
  left join authors on authors_articles.id_author = authors.id
)
select *
from cte
where rn = 1
order by surname, name
© www.soinside.com 2019 - 2024. All rights reserved.