1

ユーザー:

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)

ユーザー_プロジェクト:

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

最も多くのユーザーが割り当てられているプロジェクトを選択するにはどうすればよいですか?

SQL クエリ。

4

3 に答える 3

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 を参照してください

これにより、すべてのプロジェクトのリストと、プロジェクトごとの合計ユーザー数が返されます。ほとんどのユーザーにプロジェクトを返したい場合は、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 を参照してください

フィドルをありがとう@JW

于 2013-02-11T12:39:41.123 に答える
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
于 2013-02-11T12:41:06.377 に答える
0

探しているプロジェクトが 1 つだけの場合は、次の方法が最速の方法です。

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

(「製品」=「プロジェクト」と仮定しています)。

于 2013-02-11T14:29:23.800 に答える