嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL
LEFT JOIN and IS NULL in nested CONCAT returning NULL only
每个学生都有多个缴费时间段,我想获取未缴费的费用时间段,或者使用 MySQL
语言 - 获取不在另一种语言中的行 table.
在这里,我在 MySQL
中使用嵌套 GROUP_CONCAT
,LEFT JOIN
与 IS NULL
Table student
- 学生名单
id | ttl | cls | sec
===============================
1 | Rohit | 1 | 1
2 | Karuna | 2 | 0
Table cls
- Class
列表
id | ttl
===========
1 | One
2 | Two
Table sec
- 部分列表
id | ttl
===========
1 | A
2 | B
Table fee_tm
- 费用时间段列表
id | ttl
===========
1 | Jan
2 | Feb
Table std_fee
- 分配给学生的费用周期列表
id | s_id| f_id| fee| f_tm
====================================
1 | 1 | 4 | 100| 1
根据 table 的结构和 table 中的行,我 期望 使用我的 MySQL 代码输出。
//(student.id-student.cls-student.sec-student rest of the fee.time(Month1,Month2..))
1-Rohit-One-A-Feb,
2-Karuna-Two-John,Feb
但我得到了什么(我只想申请 NULL
和 LEFT JOIN
收费时间 ,所以剩余的 收费时间 可以获取,但这里它适用于整个结果)
2-Karuna-Two-
MySQL代码
SELECT
GROUP_CONCAT(DISTINCT CONCAT(student.id,'-',student.ttl,'-',cls.ttl,'-',
COALESCE(sec.ttl,''),
COALESCE(CONCAT('-',fee_tm.ttl),''))
ORDER BY student.id) AS stdt
FROM
student
JOIN
cls ON cls.id=student.cls
LEFT JOIN
sec ON sec.id=student.sec
LEFT JOIN
std_fee ON std_fee.s_id = student.id
LEFT JOIN
fee_tm ON fee_tm.id = std_fee.f_tm
WHERE
std_fee.f_tm IS NUll
你可以尝试为std_fee
和fee_tm
表写一个子查询,让std_fee.f_tm IS NUll
条件在ON
中做一个结果集。
What's the difference let the condition between putting in where
and ON
?
您正在使用 OUTER JOIN
如果您不在 ON
中放置条件,您将丢失此 std_fee.f_tm IS NUll
条件下的行数据,因为您匹配 fee_tm.id = std_fee.f_tm
查询看起来像这样。
查询 1:
SELECT
GROUP_CONCAT(DISTINCT CONCAT(student.id,'-',student.ttl,'-',cls.ttl,'-',
COALESCE(sec.ttl,''),
COALESCE(CONCAT(t1.ttl),''))
ORDER BY student.id) AS stdt
FROM
student
JOIN
cls ON cls.id=student.cls
LEFT JOIN
sec ON sec.id=student.sec
LEFT JOIN
(
select s.id,GROUP_CONCAT(COALESCE(fee_tm.ttl,'')) ttl
FROM
student s
LEFT JOIN
std_fee ON std_fee.s_id = s.id
LEFT JOIN
fee_tm ON fee_tm.id = std_fee.f_tm or std_fee.f_tm IS NUll
GROUP BY s.id
) t1 on t1.id = student.id
group by student.id
| stdt |
|----------------------|
| 1-Rohit-One-AJan |
| 2-Karuna-Two-Jan,Feb |
每个学生都有多个缴费时间段,我想获取未缴费的费用时间段,或者使用 MySQL
语言 - 获取不在另一种语言中的行 table.
在这里,我在 MySQL
中使用嵌套 GROUP_CONCAT
,LEFT JOIN
与 IS NULL
Table student
- 学生名单
id | ttl | cls | sec
===============================
1 | Rohit | 1 | 1
2 | Karuna | 2 | 0
Table cls
- Class
id | ttl
===========
1 | One
2 | Two
Table sec
- 部分列表
id | ttl
===========
1 | A
2 | B
Table fee_tm
- 费用时间段列表
id | ttl
===========
1 | Jan
2 | Feb
Table std_fee
- 分配给学生的费用周期列表
id | s_id| f_id| fee| f_tm
====================================
1 | 1 | 4 | 100| 1
根据 table 的结构和 table 中的行,我 期望 使用我的 MySQL 代码输出。
//(student.id-student.cls-student.sec-student rest of the fee.time(Month1,Month2..))
1-Rohit-One-A-Feb,
2-Karuna-Two-John,Feb
但我得到了什么(我只想申请 NULL
和 LEFT JOIN
收费时间 ,所以剩余的 收费时间 可以获取,但这里它适用于整个结果)
2-Karuna-Two-
MySQL代码
SELECT
GROUP_CONCAT(DISTINCT CONCAT(student.id,'-',student.ttl,'-',cls.ttl,'-',
COALESCE(sec.ttl,''),
COALESCE(CONCAT('-',fee_tm.ttl),''))
ORDER BY student.id) AS stdt
FROM
student
JOIN
cls ON cls.id=student.cls
LEFT JOIN
sec ON sec.id=student.sec
LEFT JOIN
std_fee ON std_fee.s_id = student.id
LEFT JOIN
fee_tm ON fee_tm.id = std_fee.f_tm
WHERE
std_fee.f_tm IS NUll
你可以尝试为std_fee
和fee_tm
表写一个子查询,让std_fee.f_tm IS NUll
条件在ON
中做一个结果集。
What's the difference let the condition between putting in
where
andON
?
您正在使用 OUTER JOIN
如果您不在 ON
中放置条件,您将丢失此 std_fee.f_tm IS NUll
条件下的行数据,因为您匹配 fee_tm.id = std_fee.f_tm
查询看起来像这样。
查询 1:
SELECT
GROUP_CONCAT(DISTINCT CONCAT(student.id,'-',student.ttl,'-',cls.ttl,'-',
COALESCE(sec.ttl,''),
COALESCE(CONCAT(t1.ttl),''))
ORDER BY student.id) AS stdt
FROM
student
JOIN
cls ON cls.id=student.cls
LEFT JOIN
sec ON sec.id=student.sec
LEFT JOIN
(
select s.id,GROUP_CONCAT(COALESCE(fee_tm.ttl,'')) ttl
FROM
student s
LEFT JOIN
std_fee ON std_fee.s_id = s.id
LEFT JOIN
fee_tm ON fee_tm.id = std_fee.f_tm or std_fee.f_tm IS NUll
GROUP BY s.id
) t1 on t1.id = student.id
group by student.id
| stdt |
|----------------------|
| 1-Rohit-One-AJan |
| 2-Karuna-Two-Jan,Feb |