1

实际上,我对 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:BoatAppleBoat

returns:
1. Tag w/ id 3
2. Tag w/ id 1
3. Tag w/ id 2

通过我的研究,我发现我需要某种连接组合来做到这一点。但是到目前为止,我只找到了一对多关系的解决方案(通过他们最近的帖子在一个线程中排序主题),我想我理解它们,但没有一个涉及多对多的这些三向连接关系。

我将原始 sql 作为一个可能的答案,因为我认为我真的只是要求使用 sql 方法来完成它,即使我使用 Esqueleto 进行 SQL 绑定,我认为一旦我理解了 SQL,翻译成 Esqueleto 会很简单。我使用 postgresql 作为我的后端,但我宁愿不使用 postgres 特定的东西,因为我的绑定是针对一般后端的。

有人知道我可以从哪里开始吗?我应该查看什么样的联接以及如何对最近的条目进行排序?

4

2 回答 2

2

另一种解决方案:

select t.id as tag_id, t.label as tag, max(date) as date from Tags t
join EntryTags et on t.id=et.tag_id
join Entries e on e.id=et.entry_id
group by t.label,t.id
order by date desc,tag

返回:

tag_id  tag    date   
------  -----  -----  
1       Apple  jan 3  
3       Car    jan 3  
2       Boat   jan 2  

(在您的数据中,Apple 的最新条目是 1 月 3 日,而不是 1 月 2 日。)

Postgres 中的联接是隐含的“内部联接”。如果您可能有没有条目的标签,您需要将连接更改为左连接。

于 2013-08-08T00:07:59.300 回答
0

SQL小提琴

您的示例数据与文本不符。表 entrytags 应该是

(1, 1),
(1, 2),
(2, 2),
(2, 1),
(3, 3);

select id, label
from (
    select distinct on (t.id) e.date, t.label, t.id
    from
        entries e
        inner join
        entrytags et on et.entry_id = e.id
        inner join
        tags t on t.id = et.tag_id
    order by t.id, e.date desc, t.label
) s
order by "date" desc, label
于 2013-08-08T00:04:45.027 回答