LEFT JOIN и NULL во вложенном CONCAT, возвращающем только NULL - PullRequest
0 голосов
/ 12 ноября 2018

У каждого учащегося есть несколько периодов оплаты, я хочу выбрать период времени, за который плата не уплачена, или на MySQL языке - получить строку, которой нет в другой таблице.

Здесь я использую вложенные GROUP_CONCAT в MySQL и LEFT JOIN с IS NULL

Таблица student - списки студентов

id  |   ttl     |   cls |   sec
===============================
1   |   Rohit   |   1   |   1
2   |   Karuna  |   2   |   0

Таблица cls - списки класса

id  |   ttl
===========
1   |   One
2   |   Two

Таблица sec - списки разделов

id  |   ttl
===========
1   |   A
2   |   B

Таблица fee_tm - списки Период оплаты услуг

id  |   ttl
===========
1   |   Jan
2   |   Feb

Таблица std_fee - списки стоимости обучения, назначенной студенту

id  |   s_id|   f_id|   fee|    f_tm    
====================================
1   |   1   |   4   |   100|    1

В соответствии со структурой таблиц и строк в таблице я ожидаю после вывода с моим кодом 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-

SQL Fiddle

MySQL Code

  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

1 Ответ

0 голосов
/ 12 ноября 2018

Вы можете попробовать написать подзапрос для таблиц std_fee и fee_tm и разрешить условию std_fee.f_tm IS NUll в ON создать набор результатов.

В чем разница между условием ввода where и 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 |
...