2013-02-11 33 views
1

用户的产品:SQL SELECT与大多数用户

uid int(11) - userid(primary key, auto_increment) 
name varchar(255) 
pass varchar(64) 
created int(11) 

项目:

pid int(11) ..... 
name varchar(150) 
description varchar(255) 
created int(11) 

users_projects:

uid int(11) - user id 
pid int(11) - product id 

如何选择与分配给它的最ussers项目?

sql查询。

+1

你正在使用什么[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)? 'SQL Server'? 'MySQL'? 'Oracle'? 'DB2'?并定义**产品与大多数用户** – 2013-02-11 12:28:30

+0

我使用mysql – emcee22 2013-02-11 12:31:09

+0

第二个问题呢?你怎么知道一个产品拥有最多的用户?我想你的意思是项目是正确的? – 2013-02-11 12:32:15

回答

3

你可以使用这样的事情:

select p.pid, 
    p.name, 
    up.TotalUsers 
from projects p 
inner join 
(
    select pid, count(uid) TotalUsers 
    from users_projects 
    group by pid 
) up 
    on p.pid = up.pid 
order by TotalUsers Desc 
-- limit 1 

SQL Fiddle with Demo

这将返回所有项目的列表,每个项目总用户的数量。如果你想返回的项目将最多的用户,那么你将包括被注释掉的limit 1

如果你有一个以上的project具有相同数量的用户,那么你可能需要使用类似这样:

select p.pid, 
    p.name, 
    up.TotalUsers 
from projects p 
inner join 
(
    select pid, count(uid) TotalUsers 
    from users_projects 
    group by pid 
) up 
    on p.pid = up.pid 
where totalusers = (select count(*) Total 
        from users_projects 
        group by pid 
        order by total desc 
        limit 1) 

的小提琴

SQL Fiddle with Demo

感谢@JW

+0

谢谢队友!不错的工作 – emcee22 2013-02-11 14:25:46

+0

@PaulHarbuz欢迎您。 :) – Taryn 2013-02-11 14:26:12

1

以下查询将包含多个具有相同用户数且恰好是最多用户数的项目。

SELECT a.name userName, c.name ProjectName 
FROM users a 
     INNER JOIN users_projects b 
      ON a.uid = b.uid 
     INNER JOIN projects c 
      ON b.pid = c.pid 
     INNER JOIN 
     (
      SELECT pid, COUNT(*) totalCount 
      FROM users_projects 
      GROUP BY pid 
      HAVING COUNT(*) = (SELECT COUNT(*) x 
           FROM users_projects 
           GROUP BY pid 
           ORDER BY x DESC 
           LIMIT 1) 
     ) d ON b.pid = d.pid 
ORDER BY a.Name ASC 
+1

+1用于思考重复。 – Ambrose 2013-02-11 12:56:27

0

如果你正在寻找只有一个项目,以下是最快的方法:

select project_id, count(*) as NumUsers 
from user_projects 
group by project_id 
order by count(*) desc 
limit 1 

(我假设“产品“=”项目“)。