sql请求分发正确的徽章并模糊其余部分

wz1wpwve  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(378)

我有一张table badges 它列出了所有可用的徽章(徽章id、名称、描述等),一个表格 users 它列出了所有用户(用户id、名称等)和一个表 users_badges 保存所有获得的徽章(id、徽章id、用户id)。
如果用户1获得徽章5,则输入一个条目(x,5,1) users_badges (用户只能获得一次每个徽章)。
为了向每个用户展示她迄今为止获得的哪些徽章以及哪些徽章仍然丢失,我想列出她所有的徽章,而已获得的徽章是彩色的,而未获得的徽章是灰色的。
为此,我需要一个适当的sql查询—这正是我正在努力解决的问题。可能的输出是一个独特的列表,旁边有所有的徽章和特定用户的用户id;如果她还没拿到徽章的话,那就无效了。
第一次尝试:

  1. SELECT * FROM badges
  2. LEFT JOIN users_badges ON badges.id = users_badges.badge_id
  3. WHERE users_badges.user_id = ".$row['user_id']." OR users_badges.user_id IS NULL
  4. ORDER BY badges.id

问题:这只适用于拥有其他用户或更多用户的所有徽章的用户,因为where踢出的徽章只属于其他用户。
第二次尝试:

  1. SELECT * FROM badges
  2. LEFT JOIN users_badges ON badges.id = users_badges.badge_id
  3. ORDER BY badges.id

问题:如果徽章由多个用户拥有,则会多次列出。添加 DISTINCT 无法解决问题,因为行已经是不同的(不同的用户ID)。也许可以从这个方法出发,用 user_id 但前提是她已经获得徽章(以确保所有非自有徽章也被列出(灰色))?
谢谢!

3qpi33ja

3qpi33ja1#

在对数据结构进行一些假设后,我为本例创建了虚拟表:

  1. create table #badges
  2. (
  3. badge_id int,
  4. [name] varchar(50),
  5. [description] varchar(50)
  6. )
  7. create table #users
  8. (
  9. [user_id] int,
  10. [name] varchar(50)
  11. )
  12. create table #users_badges
  13. (
  14. id int,
  15. badge_id int,
  16. [user_id] int
  17. )
  18. insert into #badges
  19. values
  20. (1,'Starter Badge','It''s your first time.'),
  21. (2,'Rookie Badge','You''re just getting started.'),
  22. (3,'Intermediate Badge','Now you''re starting to get the hang of this.'),
  23. (4,'Expert Badge','You are a master!')
  24. insert into #users
  25. values
  26. (1,'John Smith'),
  27. (2,'Alice Johnson'),
  28. (3,'Phillip Black'),
  29. (4,'Sarah Goodwell'),
  30. (5,'Ian Hunter')
  31. insert into #users_badges
  32. values
  33. (1,1,1),
  34. (2,1,2),
  35. (3,1,3),
  36. (4,1,4),
  37. (5,2,1),
  38. (6,2,2),
  39. (7,2,4),
  40. (8,3,5),
  41. (9,4,1),
  42. (10,4,2)

我认为这就是您要寻找的结果(这里,特别是使用 user_id 第1页-约翰·史密斯):

  1. select
  2. b.*,
  3. case when ub.id is not null then 'Earned' else null end as badgeStatus
  4. from #badges b
  5. left join #users_badges ub on b.badge_id = ub.badge_id and ub.[user_id] = 1

下面列出了所有的徽章,并显示了john获得的徽章:

  1. /------------------------------------------------------------------------|--------\
  2. | id | name | description | status |
  3. |----|--------------------|----------------------------------------------|--------|
  4. | 1 | Starter Badge | It's your first time. | Earned |
  5. | 2 | Rookie Badge | You're just getting started. | Earned |
  6. | 3 | Intermediate Badge | Now you're starting to get the hang of this. | NULL |
  7. | 4 | Expert Badge | You are a master! | Earned |
  8. \---------------------------------------------------------------------------------/
展开查看全部

相关问题