3

私はこれと戦うために数時間を費やしました、しかし私はカウントを機能させることができません。うまくいけば、誰かが助けることができますか?!

project_idにリンクされたプロジェクトテーブルとタスクテーブルがあります。以下のクエリでproject_id、project_name、status_idを取得できます。

SELECT 
    a.project_id, 
    a.project_name,
    b.status_id
FROM project_list as a
INNER JOIN task_list as b
ON a.project_id=b.project_id

プロジェクトごとに1つのレコードを選択し、status_idに基づいて2つのカウントフィールドを追加したいと思います。擬似コードの場合:

SELECT 
    a.project_id, 
    a.project_name,
    (SELECT COUNT(*) FROM task_list WHERE status_id < 3) as not_completed,
    (SELECT COUNT(*) FROM task_list WHERE status_id = 3) as completed
FROM project_list as a
INNER JOIN task_list as b
ON a.project_id=b.project_id
GROUP BY project_id

私のテーブル作成スクリプトは以下のとおりです。

CREATE TABLE `project_list` (
  `project_id` int(11) NOT NULL AUTO_INCREMENT,
  `topic_id` int(11) DEFAULT NULL,
  `project_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`project_id`)
)

CREATE TABLE `task_list` (
  `task_id` int(11) NOT NULL AUTO_INCREMENT,
  `project_id` int(11) DEFAULT NULL,
  `task_name` varchar(45) DEFAULT NULL,
  `status_id` int(11) DEFAULT '0',
  PRIMARY KEY (`task_id`)
)

どんな助けでも大歓迎です。ありがとう!

編集:答え:

SELECT 
    a.project_id, 
    project_name,
    SUM(status_id != 3) AS not_completed,
    SUM(status_id = 3) AS completed,
    SUM(status_id IS NOT NULL) as total
FROM tasks.project_list as a
INNER JOIN tasks.task_list as b
ON a.project_id=b.project_id
GROUP BY a.project_id
4

1 に答える 1

4

問題は、サブクエリで、正しい行だけではなく、テーブル全体のすべての行をカウントしていることですproject_idWHEREこれは、各サブクエリの句を変更することで修正できます。

(SELECT COUNT(*)
 FROM task_list AS c
 WHERE c.status_id < 3
 AND a.project_id = c.project_id)

ただし、より簡単な方法は、条件に一致する行をカウントするSUM代わりにブール条件を使用することです。COUNT

SELECT 
    a.project_id, 
    a.project_name,
    SUM(b.status_id < 3) AS not_completed,
    SUM(b.status_id = 3) AS completed,
FROM project_list as a
INNER JOIN task_list as b
ON a.project_id = b.project_id
GROUP BY project_id

TRUEが に評価され1、 にFALSE評価されるため、これは機能し0ます。

于 2012-11-24T18:27:54.140 に答える