我有三个mysql表。 notification_tbl
,section_tbl
和user_plant_tbl
。
user_plant_tbl
有植物,一个植物可能在section_tbl
表中有多个部分。 notification_tbl
已通过部分全部关闭并打开通知。我想要的是从notification_tbl
表中获取所有关闭通知的所有部分(例如:部分名称)和计数特别是部分。
section_tbl
section_id plant
sectionX 2400
sectionY 2400
user_plant_tbl
user_id plant
3001 2400
3003 2200
notification_tbl
notification_id plant section_id open_flag
60000062 2400 sectionX x
60000063 2400 sectionX x
60000064 2400 sectionX x
60000063 2400 sectionY x
60000064 2400 sectionY x
例如,让我们看到 sectionX 在notification_tbl
表格中有 3 已关闭的通知行, sectionY 2 STRONG>。然后我想得到一个输出,
sectionX 3
sectionY 2
这是我使用的查询,但它并没有给我所需的输出。
SELECT DISTINCT
a.section_id,
(SELECT count(section_id) FROM notification_tbl WHERE open_flag = 'x') AS countx
FROM
section_tbl AS a
INNER JOIN user_plant_tbl AS b ON a.plant = b.plant
WHERE
b.user_id = 3001
AND b.plant = 2400
AND a.division = 7
GROUP BY
a.section_id
ORDER BY
countx DESC;
答案 0 :(得分:3)
根据您的示例,section_id
中也有一个notification_tbl
列,因此您可以将section_tbl
和notification_tbl
关联在该列上。以下查询给出了答案:
SELECT
s.section_id,
COUNT(n.section_id) AS count_closed
FROM section_tbl AS s
INNER JOIN notification_tbl AS n ON n.section_id = s.section_id
INNER JOIN user_plant_tbl AS u ON s.plant = u.plant
WHERE
u.user_id = 3001
AND u.plant = 2400
AND s.division = 7
AND n.open_flag = 'X'
GROUP BY
s.section_id
ORDER BY
count_closed DESC;
<强> 更新 强>
根据您的评论我修改了查询以获得这些结果。
SELECT
s.section_id,
SUM(case when n.open_flag = 'X' then 1 else 0 end) AS count_closed,
SUM(case when n.open_flag <> 'X' then 1 else 0 end) AS count_opened
FROM section_tbl AS s
INNER JOIN notification_tbl AS n ON n.section_id = s.section_id
INNER JOIN user_plant_tbl AS u ON s.plant = u.plant
WHERE
u.user_id = 3001
AND u.plant = 2400
GROUP BY
s.section_id
ORDER BY
count_closed DESC;
请参阅 DEMO 。
然后考虑尚未打开或关闭状态标志的新插入部分。
SELECT
s.section_id,
SUM(CASE WHEN n.open_flag = 'X' THEN 1 ELSE 0 END) AS count_closed
FROM section_tbl AS s
LEFT JOIN notification_tbl AS n ON s.section_id = n.section_id
INNER JOIN user_plant_tbl AS u ON s.plant = u.plant
WHERE
u.user_id = 3001
AND u.plant = 2400
GROUP BY
s.section_id
ORDER BY
count_closed DESC;
<强> DEMO 强>