**编辑**
我使用了第一个答案中的查询,但最终不得不修改它,因为它不会在没有任何会话的情况下返回多个调查。我终于解决了这个查询:
(SELECT i.id AS id, i.title AS title, c.title AS ctitle, c.color AS ccolor,
i.active AS active, i.length AS length, i.redirect AS redirect,
COUNT(s.sid) AS number
FROM survey_info i
LEFT JOIN survey_sessions s ON s.sid = i.id
INNER JOIN survey_category c ON i.category = c.id
WHERE s.sid IS NOT NULL
GROUP BY s.sid)
UNION ALL
(SELECT i.id AS id, i.title AS title, c.title AS ctitle, c.color AS ccolor,
i.active AS active, i.length AS length, i.redirect AS redirect,
0 AS number
FROM survey_info i
LEFT JOIN survey_sessions s ON s.sid = i.id
INNER JOIN survey_category c ON i.category = c.id
WHERE s.sid IS NULL)
ORDER BY 2
解释一下,从下面获取查询,并仅返回具有会话(已进行)的调查,然后使用 UNION ALL 子句将这些结果与仅检索没有会话(尚未进行的调查)的 SELECT 相结合.) 最后,它按第二列(调查标题)对组合结果进行排序
我希望这可以帮助其他人。
-------------------------------------------------- ------------------------------------------
我一直在研究一项调查计划,让人们可以创建和管理调查。昨天我问了一个关于存储结果的问题,并意识到我做错了(为每个调查不寒而栗创建额外的表格)
我现在有一个新的表结构,它工作得更好,让我始终保持 6 个表。我有一个新的困境,我整夜都在努力,希望有人能指出我正确的方向。
我的表格现在如下:
调查信息
id(bigint) PK
title(varchar)
category(bigint)
length(bigint)
active(tinyint)
调查类别
id(bigint) PK
title(varchar)
color(varchar)
调查会话
id PK
timestamp(bigint)
我最初使用以下 SQL 来收集调查及其会话数(所用时间)
SELECT i.id AS id, i.title AS title, c.title AS ctitle, c.color AS ccolor,
i.active AS active, i.length AS length, i.redirect AS redirect,
COUNT(s.sid) AS number
FROM survey_info i, survey_category c, survey_sessions s
WHERE i.category = c.id AND s.sid = i.id
GROUP BY s.sid
但是,正如您可能已经猜到的那样,这意味着每当我创建一个新的调查(从未进行过)时,它都不会出现在这个列表中,因为在survey_session 表中没有它的条目。
当survey_sessions中没有行时,是否可以使用MySQL中的条件语句返回0来代替“COUNT(s.sid) AS number”?我已经阅读了很多关于 LEFT JOIN 的信息,但我认为它们不会起作用,因为没有任何东西可以将新调查连接到survey_sessions 表。