【问题标题】:Collecting data from 3 tables into 1 query将 3 个表中的数据收集到 1 个查询中
【发布时间】:2012-07-12 18:41:42
【问题描述】:

我的 MySQL 数据库中有三个不同的表。

表用户:(id、score、name)
表团队:(id,标题)
表 team_Members: (team_id, user_id)

我想做的是有 1 个查询来查找给定用户 ID 所属的每个团队 ID,以及以下信息:

  1. 该团队的成员总数
  2. 团队名称
  3. 用户在团队中的排名(基于分数)

编辑:

所需的输出应如下所示;

TITLE (of the group)      NUM_MEMBERS       RANK
------------------------------------------------
Foo bar team              5                 2
Another great group       34                17
.
.
.

查询应基​​于用户 ID。

非常感谢您的帮助

【问题讨论】:

  • 您能否编辑您的问题以提供一些示例数据以及您希望从该数据中获得的输出?

标签: mysql


【解决方案1】:

要收集你只需要使用 JOIN

SELECT 
  u.*, t.*, tm.* 
FROM 
  users u 
JOIN 
  team_Members tm ON  u.id = tm.user_id 
JOIN 
  teams t ON t.id = tm.team_id;

要获得该团队的总数,请使用 COUNT 和一些组键

有些是这样的

SELECT 
  COUNT(t.id), u.*, t.*, tm.* 
FROM 
  users u 
JOIN 
  team_Members tm ON u.id = tm.user_id 
JOIN 
  teams t ON t.id = tm.team_id GROUP BY t.id;

并且仅排名:

SELECT 
  COUNT(t.id) as number_of_members, u.*, t.*, tm.* 
FROM 
  users u 
JOIN 
  team_Members tm ON u.id = tm.user_id 
JOIN 
  teams t ON t.id = tm.team_id 
GROUP BY t.id 
ORDER BY u.score;

【讨论】:

  • 在您的 SQL 中放置某种换行符以避免令人讨厌的水平滚动并使您的答案更容易阅读,这里没有任何惩罚。 :-) 我们真的很感激。谢谢。
【解决方案2】:

我认为这个查询应该得到你想要的

select t.id, t.title, count(m.user_id) members, (
    select count(1)
    from users u3 
    inner join team_Members m3 on u3.id = m3.user_id 
    and m3.team_id = t.id and u3.score > (
        select score from users where name = 'Johan'
    )
) + 1 score
from teams t
inner join team_Members m on t.id = m.team_id
where t.id in (
    select team_id 
    from team_Members m2
    inner join users u2 on m2.user_id = u2.id
    where u2.name = 'Johan'
)
group by t.id, t.title

【讨论】:

  • 请注意,名称会出现在两个地方;),否则我认为查询会更加复杂。
  • 这几乎就是我想要的。感谢您为将全新的选择作为字段提供灵感!
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2015-06-18
  • 2020-12-24
  • 2013-04-11
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多