count包含标记属于指定用户的项的标记

w8rqjzmb  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(316)

我有一个包含varchar的两个表:
项目\标记\集:项目,标记

用户:用户id,名称。
如何提出一个要求,将显示标签和相同的标签数量我的项目。请求还应该在结果中包含一个指针(它的标记),指向该标记属于指定用户的事实。

  1. CREATE TABLE items_tags_sets (
  2. uit_set_id varchar PRIMARY KEY,
  3. item_id varchar,
  4. user_id varchar,
  5. tag varchar
  6. );
  7. CREATE TABLE users (
  8. user_id varchar PRIMARY KEY,
  9. name varchar
  10. );
  11. insert into items_tags_sets values('uid1', 'it1', 'usr1', 'tag_test1');
  12. insert into items_tags_sets values('uid2', 'it2', 'usr2', 'tag_test1');
  13. insert into items_tags_sets values('uid3', 'it3', 'usr3', 'tag_test2');
  14. insert into items_tags_sets values('uid4', 'it4', 'usr1', 'tag_test2');
  15. insert into items_tags_sets values('uid5', 'it1', 'usr2', 'tag_test3');
  16. insert into items_tags_sets values('uid6', 'it2', 'usr3', 'tag_test3');
  17. insert into items_tags_sets values('uid7', 'it3', 'usr1', 'tag_test4');
  18. insert into items_tags_sets values('uid8', 'it4', 'usr2', 'tag_test4');
  19. insert into items_tags_sets values('uid9', 'it1', 'usr3', 'tag_test5');
  20. insert into items_tags_sets values('uid10', 'it2', 'usr1', 'tag_test5');
  21. insert into items_tags_sets values('uid11', 'it1', 'usr2', 'tag_test1');
  22. insert into items_tags_sets values('uid12', 'it1', 'usr3', 'tag_test1');
  23. insert into items_tags_sets values('uid13', 'it1', 'usr2', 'tag_test3');
  24. insert into users values('usr1', 'name1');
  25. insert into users values('usr2', 'name2');
  26. insert into users values('usr3', 'name3');
  27. --------------------------------------------------------------
  28. SELECT
  29. items_tags_sets.item_id,
  30. items_tags_sets.tag,
  31. count(items_tags_sets.tag) as tags_count,
  32. items_tag_you.user_id as its_tag
  33. FROM items_tags_sets
  34. LEFT OUTER JOIN users as items_tag_you on items_tag_you.user_id = items_tags_sets.user_id and items_tag_you.user_id = 'usr1'
  35. WHERE items_tags_sets.item_id = 'it1'
  36. GROUP BY items_tags_sets.item_id, items_tags_sets.tag, items_tag_you.user_id;

我需要这样的结果:

  1. ----------------------------------------------
  2. | item_id | tag | tags_count | its_tag |
  3. |--------------------------------------------|
  4. | it1 | tag_test1 | 3 | usr1 |
  5. | it1 | tag_test3 | 2 | |
  6. | it1 | tag_test5 | 1 | |
  7. ----------------------------------------------

链接到代码:https://rextester.com/gmjqr57790

8ljdwjyq

8ljdwjyq1#

而不是函数“count()。。。按“use the windowed function counter part”count()over…“分组。按该计数的结果降序,然后对该计数也使用“distinct on”子句。

  1. select distinct on (3)
  2. its.item_id "Item Id"
  3. , its.tag "Tag"
  4. , count(its.tag) over (partition by its.tag) "Tags Count"
  5. , usr.user_id "Its Tag"
  6. from items_tags_sets its
  7. left join users usr
  8. on ( usr.user_id = its.user_id
  9. and usr.user_id = 'usr1'
  10. )
  11. where its.item_id = 'it1'
  12. order by 3 desc;

我不明白为什么要用更复杂的“items\u tag\u you”来别名一个简单的表名“users”,从而设置一个更难理解的名称。所以我没有,但两个表都使用了一个简单的别名。一天的小贴士:让你的查询尽可能简单易读,你总是可以在最终输出中添加更多描述性的术语。

相关问题