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ラベルの前に来るため、2 番目と3 番目になります。BoatAppleBoat

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

私の調査を通じて、これを行うには何らかの結合の組み合わせが必要であることがわかりました。ただし、これまでのところ、1 対多の関係 (スレッド内のトピックを最新の投稿で並べ替える) の解決策しか見つかりませんでした。それらを理解していると思いますが、多対多のこれらの 3 方向結合を含むものはありません。関係。

可能な答えとして生のSQLを含めています.SQLの方法を本当に求めているだけだと思います.SQLバインディングにEsqueletoを使用していますが、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 月 2 日ではなく 1 月 3 日です。)

Postgres の結合は暗黙の「内部結合」です。エントリのないタグがある場合は、結合を左結合に変更する必要があります。

于 2013-08-08T00:07:59.300 に答える
0

SQL フィドル

サンプル データがテキストに適合しません。テーブルのエントリタグは

(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 に答える