实际上,我对 SQL 的工作方式有点陌生——我总是让我的 ORM 为我处理一切。但是在这种情况下,Persistent 没有公开这种功能,所以我不知道该怎么做。
我有一个多对多的关系:
+------------+
| Entries |
+----+-------+
| id | date |
+----+-------+
| 1 | Jan 1 |
+----+-------+
| 2 | Jan 2 |
+----+-------+
| 3 | Jan 3 |
+----+-------+
+------------+
| Tags |
+------------+
| id | label |
+----+-------+
| 1 | Apple |
+----+-------+
| 2 | Boat |
+----+-------+
| 3 | Car |
+----+-------+
+-------------------+
| EntryTags |
+----------+--------+
| entry_id | tag_id |
+----------+--------+
| 1 | 1 |
+----------+--------+
| 1 | 2 |
+----------+--------+
| 2 | 2 |
+----------+--------+
| 3 | 3 |
+----------+--------+
我想主要按标签最近条目的日期(降序)对标签进行排序,其次是标签(升序)。
TagCar
的最新条目是 1 月 3 日,所以它排在第一位。TagApple
的最新条目是 1 月 2 日,但 tag 也是如此Boat
。但是,标签按字母顺序位于标签Apple
之前,因此是 2nd 和3rd:Boat
Apple
Boat
returns:
1. Tag w/ id 3
2. Tag w/ id 1
3. Tag w/ id 2
通过我的研究,我发现我需要某种连接组合来做到这一点。但是到目前为止,我只找到了一对多关系的解决方案(通过他们最近的帖子在一个线程中排序主题),我想我理解它们,但没有一个涉及多对多的这些三向连接关系。
我将原始 sql 作为一个可能的答案,因为我认为我真的只是要求使用 sql 方法来完成它,即使我使用 Esqueleto 进行 SQL 绑定,我认为一旦我理解了 SQL,翻译成 Esqueleto 会很简单。我使用 postgresql 作为我的后端,但我宁愿不使用 postgres 特定的东西,因为我的绑定是针对一般后端的。
有人知道我可以从哪里开始吗?我应该查看什么样的联接以及如何对最近的条目进行排序?