好吧,这有点难以解释,标题也不是最好的:/,但是,基本上,我有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的所有项目必须先返回Item1
和Item4
,并通过升序排列CreatedAt
。然后Item2
和Item3
并按CreatedAt
升序排列。因此结果将是:
* Item1
* Item4
* Item2
* Item3
我对SQL没有经验,所以如果我什至正确地解释它,也许有很多众所周知的解决方案?
感谢任何帮助!
您可以进行条件排序:
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