Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Esqueleto/raw SQL——根据另一个表上的排序结果对查询进行排序?_Sql_Haskell_Yesod_Esqueleto - Fatal编程技术网

Esqueleto/raw SQL——根据另一个表上的排序结果对查询进行排序?

Esqueleto/raw SQL——根据另一个表上的排序结果对查询进行排序?,sql,haskell,yesod,esqueleto,Sql,Haskell,Yesod,Esqueleto,实际上,我对SQL的工作方式有点陌生——我总是让ORM为我处理一切。但是在这种情况下,Persistent不会公开这种功能,所以我不知道该怎么做 我有一种多对多的关系: +------------+ | Entries | +----+-------+ | id | date | +----+-------+ | 1 | Jan 1 | +----+-------+ | 2 | Jan 2 | +----+-------+ | 3 | Jan 3 | +----+-------+

实际上,我对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      |
+----------+--------+
我想主要按照标签的最新输入日期(降序)对标签进行排序,其次是标签(升序)

Tag
Car
最近一次进入是在1月3日,所以它先进入。 Tag
Apple
最近一次登场是1月2日,但Tag
Boat
也是如此。但是,标签
Apple
按字母顺序排在标签
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特定的东西,因为我的绑定用于一般后端

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

您的示例数据与文本不符。表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
另一个解决方案:

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  
(在您的数据中,苹果最近一次发布的是1月3日,而不是1月2日。)


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

如果不需要标签id,而问题中没有明确的标签id,则可以使用。已更新为包含标签id。我同意问题中所需的输出不太清楚@justin,请澄清这是否不是您需要的输出。输出足够了,我只需要以某种形式引用行。我只是不知道如何分类。谢谢:)谢谢你的更正和解决方案:)虽然我很抱歉,我对最佳答案的选择有点武断,因为这两种解决方案似乎都有效,但我仍然难以在ORM中使用,因此我的最终解决方案是两者的混合。