[英]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中完成此操作(或者我能得到的最接近的结果),还是必须在界面的另一端完成?
我也说家庭,因为这是一个系列所代表的意思,一本书籍。
从上面的评论中可以说:这里的排序顺序令人困惑!
我将其概念化为两个步骤:
第一步很简单:
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;
拉特的答案很好,但实际上要简单得多。 这适用于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.