嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

LEFT JOIN and IS NULL in nested CONCAT returning NULL only

每个学生都有多个缴费时间段,我想获取未缴费的费用时间段,或者使用 MySQL 语言 - 获取不在另一种语言中的行 table.

在这里,我在 MySQL 中使用嵌套 GROUP_CONCATLEFT JOINIS 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

但我得到了什么(我只想申请 NULLLEFT JOIN 收费时间 ,所以剩余的 收费时间 可以获取,但这里它适用于整个结果)

2-Karuna-Two-

SQL Fiddle

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_feefee_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

Results:

|                 stdt |
|----------------------|
| 1-Rohit-One-AJan     |
| 2-Karuna-Two-Jan,Feb |