SQL - 选择唯一位置非零事物,排序 - 处理"families"事物



标题很糟糕,因为我实际上不确定它叫什么。我问是因为我不是第一个想这么做的人。

Series table:
id seriesName
1  WE
2  WE
id title series seriesPosition seriesName
1  A     0      0              ""
2  B     1      0              "Part I"
3  F     1      1              "Part II"
4  D     1      2              "Part III"
5  C     2      0              ""
6  E     2      1              "The return"
7  G     0      0              ""

我想按上表的顺序对数据集进行排序。也就是说,标题按升序排序,但系列的其余部分都在该系列的第一个后面。这就是为什么3和4跟在2后面,而5按字母顺序在3之前。

不过,我猜这在SQL中是做不到的。因此,我想选择具有非零序列的事物(唯一),但我想选择标题最低的一个。然后,当我处理结果时,我可以看到非零序列Id,并根据需要加载数据。

我使用的是SQLite。

我不认为我可以使用group-by,因为所有seriesId等于零的记录在逻辑上都是唯一的。这可以在SQL中完成吗(或者我能得到的最接近的方法是什么),或者必须在接口的我这边完成吗?

我也说家庭,因为这就是一个系列所代表的,一个书的家庭。

从上面的评论中可以看出:这里的排序顺序令人困惑!

我将其概念化为两步过程:

  • 获取所有非系列或系列第一本书的列表,按标题字母顺序排列
  • 按系列顺序拼接到该列表中的所有第n本系列书籍

第一步很简单:

SELECT title, series, seriesPosition, seriesName
FROM books
WHERE seriesPosition = 0
ORDER BY title;

第二步很棘手。我决定通过串联系列位置的标题来发明一个额外的列,并将此列命名为sortKey:

SELECT title, series, (title || seriesPosition) sortKey
FROM books
ORDER BY sortKey;

这个自定义sortKey是必不可少的,但我们不能只使用每本书的标题;我们需要使用该系列第一本书的书名。我们可以使用自联接来找到这一点:

SELECT a.title, a.series, a.seriesPosition, a.seriesName, (b.title || a.seriesPosition) sortKey
FROM books a
INNER JOIN books b ON a.series = b.series
WHERE a.series = 0 OR b.seriesPosition = 0
ORDER BY sortKey;

不幸的是,这包括系列0中所有书籍的重复条目。

可能有一种优雅的方法可以消除这些问题,但由于现在是下午5点,我决定在两个查询之间合并(系列和非系列书籍各一个):

SELECT title, series, seriesPosition, seriesName, title sortKey
FROM books
WHERE series = 0
UNION
SELECT a.title, a.series, a.seriesPosition, a.seriesName, (b.title || a.seriesPosition) sortKey
FROM books a
INNER JOIN books b ON a.series = b.series
WHERE a.series != 0 AND b.seriesPosition = 0
ORDER BY sortKey;

您可以在SQLFiddle上看到一个实时演示。

Rutter的答案很棒,但实际上要简单得多。这适用于MySQL:
SELECT *,true as HasSeries,
(select SeriesName from Series where Series.SeriesId = Books.SeriesId) as orderName FROM Books WHERE SeriesId != 0
UNION
SELECT *,false as HasSeries,Title as orderName FROM Books WHERE SeriesID = 0
ORDER BY orderName asc, seriesPosition asc;

我想如果它有联合,它可以与SQLite一起工作,这并不理想,因为它可能会给SQL服务器带来比我想要的更大的压力,但是的,这是一种方法!

最新更新