1

同じ ID の倍数がある左結合からテーブルの合計数を取得しようとしています。以下に私の例を示します-

表1:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| project_id  | int(11)      | NO   |     | NULL    |                |
| token       | varchar(32)  | NO   |     | NULL    |                |
| email       | varchar(255) | NO   |     | NULL    |                |
| status      | char(1)      | NO   |     | 0       |                |
| permissions | varchar(255) | YES  |     | NULL    |                |
| created     | datetime     | NO   |     | NULL    |                |
| modified    | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

表 2:

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| name       | varchar(32) | NO   |     | NULL    |                |
| account_id | int(11)     | NO   |     | NULL    |                |
| created    | datetime    | NO   |     | NULL    |                |
| modified   | datetime    | NO   |     | NULL    |                |
| active     | tinyint(1)  | YES  |     | 1       |                |
+------------+-------------+------+-----+---------+----------------+

私はこれまでにこの声明を持っています -

SELECT account_id, (SELECT COUNT(invitations.id)
    FROM invitations WHERE invitations.project_id = projects.id) AS inv_count
FROM projects order by account_id;

そして、ここに結果のサンプルがあります:

+------------+-----------+
| account_id | inv_count |
+------------+-----------+
|          1 |         0 |
|          2 |         2 |
|          2 |         0 |
|          3 |         4 |
|          3 |         0 |
|          3 |         4 |
|          3 |         0 |
|          4 |         6 |
|          4 |         3 |
|          4 |         3 |
|          4 |         5 |
|          4 |         3 |
|          4 |         9 |
|          5 |         6 |
|          5 |         0 |
|          5 |         4 |
|          5 |         2 |
|          5 |         2 |

account_id を 1 回表示し、inv_count の合計を 1 行として表示するにはどうすればよいですか? だから私は見る必要があります -

+------------+-----------+
| account_id | inv_count |
+------------+-----------+
|          1 |         0 |
|          2 |         2 |
|          3 |         8 |
4

1 に答える 1

5

クエリを派生テーブルに配置し (名前を付けて、たとえばtmp)、次のようにグループ化するだけaccount_idです。

SELECT account_id,
       SUM(inv_count) AS inv_count
FROM
  ( SELECT account_id, 
           (SELECT COUNT(invitations.id)
            FROM invitations 
            WHERE invitations.project_id = projects.id
           ) AS inv_count
    FROM projects 
  ) AS tmp
GROUP BY account_id
ORDER BY account_id ;

さらに単純化するために、インライン サブクエリをLEFT結合に変換できます。この方法では、派生テーブルは必要ありません。また、エイリアスを追加し、ORDER BY. MySQL は暗黙的ORDER BYに実行するGROUP BYため、ここでは必要ありません (グループ化したものとは異なる他の式で並べ替えたい場合を除きます):

SELECT 
    p.account_id,
    COUNT(i.id) AS inv_count 
FROM 
    projects AS p 
  LEFT JOIN 
    invitations AS i
      ON i.project_id = p.id
GROUP BY 
    p.account_id ;
于 2013-05-02T22:13:11.657 に答える