1

我有几个表的数据库,其中 2 个定义为:

CREATE TABLE [projects] (
  [id]  INTEGER         NOT NULL PRIMARY KEY,
  [code]    VARCHAR(128)    UNIQUE NOT NULL COLLATE NOCASE,
  [name]    VARCHAR(128)    DEFAULT "Not Set" NOT NULL COLLATE NOCASE
)

CREATE TABLE [tasks] (
  [id]          INTEGER  NOT NULL PRIMARY KEY,
  [project_id]  INTEGER  NOT NULL,
  [notes]       VARCHAR(512) DEFAULT 'Not Set' NOT NULL COLLATE NOCASE,
  [start]       DATE  NOT NULL,
  [finish]      DATE  NOT NULL,
  [rate_id]         INTEGER DEFAULT 1 NOT NULL
)

我有这个查询,它返回带有使用次数的项目详细信息列表:

SELECT p.*, count(t.project_id) as length
FROM projects as p, tasks as t
WHERE p.id=t.project_id
GROUP BY p.code
ORDER BY length DESC;

但正如我发现的那样,如果不使用项目 ID(没有给定项目 ID 的任务),它将返回小于项目的列表。

有没有办法以与我当前查询相同的格式创建完整的项目列表并添加长度但包括所有项目并且对于那些没有任务长度的项目将有 0?

4

1 回答 1

1

要获得没有任务的项目,请使用左外连接。ifnull函数将 any 转换为零NULL

SELECT p.*, IFNULL(COUNT(t.project_id), 0) AS length
FROM projects AS p
LEFT JOIN tasks AS t ON p.id = t.project_id
GROUP BY p.code
ORDER BY length DESC
于 2013-08-19T11:40:22.717 回答