查找按升序排列的X标签的所有记录,但是,与大多数标签匹配的记录应首先分 组

问题描述 投票:0回答:1

好吧,这有点难以解释,标题也不是最好的:/,但是,基本上,我有3个表,并且我试图编写一个查询,以2个级别的顺序返回它们。第一个按每行具有的“标签”数量,第二个按创建该行的时间。

Table1: Items
  * ID
  * Name
  * CreatedAt

Table2: Tags
  * ID
  * Name

Table3: TaggedItems
  * TagID
  * ItemID

而且,我想列出所有具有1个或多个标签的项目,并按创建时的升序排列。但是,这是我遇到问题的地方,我希望排序基于与某个项目匹配的标签的数量,并在该排序中应用升序条件。

所以,假设我有:

Item1 -> CreatedAt(0), Tags(A, B)
Item2 -> CreatedAt(0), Tags(A)
Item3 -> CreatedAt(1), Tags(B)
Item4 -> CreatedAt(1), Tags(A, B)

然后搜索带有标签A和B的所有项目必须先返回Item1Item4,并通过升序排列CreatedAt。然后Item2Item3并按CreatedAt升序排列。因此结果将是:

* Item1
* Item4
* Item2
* Item3

我对SQL没有经验,所以如果我什至正确地解释它,也许有很多众所周知的解决方案?

感谢任何帮助!

sql postgresql tags
1个回答
0
投票

您可以进行条件排序:

select i.*, x.no_tags
from items
cross join lateral (
    select count(*) no_tags
    from taggedItems ti
    inner join tags t on t.id = ti.tagID
    where ti.ItemID = i.ID and t.name in ('A', 'B')
) x
order by
    (x.no_tags > 1) desc,
    case when x.no_tags > 1 then i.createdAt end desc,
    createdAt
© www.soinside.com 2019 - 2024. All rights reserved.