繁体   English   中英

SQL-选择唯一的非零位置的事物并排序-处理事物的“族”

[英]SQL - selecting unique-where-non-zero things, and ordering - dealing with “families” of things

标题是废话,因为我实际上不确定这叫什么。 我问,因为我不能成为第一个这样做的人。 (我用“无论如何”或“ WE”表示无所谓)

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中完成。 因此,我想选择一个非零序列(唯一)的事物,但我想选择标题最低的事物。 然后,当我处理结果时,我可以看到非零的seriesId并根据需要加载数据。

我正在使用SQLite。

我认为我不能使用group by,因为seriesIds等于零的所有记录在逻辑上都是唯一的。 可以在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上观看实时演示。

拉特的答案很好,但实际上要简单得多。 这适用于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服务器带来比我想要的更大的负担,但是是的,这是一种实现方法!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM