LEFT JOIN / IS NULL не работает должным образом - выбрать только строку, которой нет в другой таблице - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь выбрать строки, которых нет в другой таблице.Здесь я использовал LEFT JOIN с IS NULL , но не получил ожидаемого результата.Это работает только один за столом, но не в другой таблице.

В основном я не могу управлять отношениями между четырьмя таблицами.fee - включает в себя категории сборов) и fee_tm - включает списки месяцев для уплаты сборов), cls_fee - критерии оплаты для каждого класса) и invoice - содержит информацию о платных сборах).

И в результате я пытаюсь показать списки студентов, которые не заплатили, или те записи студентов, которых нет в таблице invoice.

Mysql

SELECT
    fee_tm.id AS ftm_d,
    fee.id AS f_id,
    fee_tm.en_ttl AS f_tm,
    fee.en_ttl AS fee,
    cls_fee.fee AS f_mnt
FROM
    fee
LEFT JOIN
    fee_tm ON fee_tm.year = fee.year
LEFT JOIN
    cls_fee ON cls_fee.fee_id = fee.id
LEFT JOIN
    student ON student.cls = cls_fee.c_id AND student.sec = cls_fee.s_id
LEFT JOIN
    invoice ON invoice.stu_id = student.id AND invoice.fee_id = fee.id AND invoice.ftm_id = fee_tm.id
WHERE
    student.id =1 AND invoice.ftm_id is NULL AND invoice.fee_id is NULL

Текущий результат

ftm_d   |   f_id    |   f_tm    |   fee     |   f_mnt
=====================================================
2       |   1       |   Feb     |   Annual  |   1000
2       |   2       |   Feb     |   Monthly |   560

Ожидаемый результат

ftm_d   |   f_id    |   f_tm    |   fee     |   f_mnt
=====================================================
2       |   2       |   Feb     |   Monthly |   560

Мой результат проверяет только столбец f_tm, поэтому в моем текущем результате месяц Jan фильтруется, но он также должен проверять столбец fee и строка Annual должна быть отфильтрована.

Итак, мы можем знать студентов, которые не заплатили за обучение.Если запись находится в таблице invoice, то в результате следует отфильтровать эту категорию оплаты.

Структура базы данных

Студент

id  |   en_ttl  |   cls |   sec |   year
========================================
1   |   John    |   1   |   1   |   1

cls

id  |   en_ttl  |   year
========================
1   |   One     |   1

sec

id  |   en_ttl  |   year
========================
1   |   A       |   1

плата

id  |   en_ttl  |   year
========================
1   |   Annual  |   1
2   |   Monthly |   1
3   |   Library |   1

fee_tm

id  |   en_ttl  |   year
========================
1   |   Jan     |   1
2   |   Feb     |   1

cls_fee

id  |   c_id    |   s_id    |   fee_id  |   fee
===============================================
1   |   1       |   1       |   1       |   1000
2   |   1       |   1       |   2       |   560

счет

id  |   stu_id  |   fee_id  |   ftm_id
======================================
1   |   1       |   1       |   1

DDL Утверждения таблиц

CREATE TABLE `student` (
 `id` int(4) NOT NULL AUTO_INCREMENT,
 `en_ttl` varchar(100) NOT NULL,
 `cls` int(2) NOT NULL,
 `sec` int(2) NOT NULL,
 `year` int(1) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `cls` (
 `id` int(2) NOT NULL AUTO_INCREMENT,
 `en_ttl` varchar(50) NOT NULL,
 `year` int(2) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `sec` (
 `id` int(2) NOT NULL AUTO_INCREMENT,
 `en_ttl` varchar(50) NOT NULL,
 `year` int(2) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `fee` (
 `id` int(2) NOT NULL AUTO_INCREMENT,
 `en_ttl` varchar(50) NOT NULL,
 `year` int(2) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `fee_tm` (
 `id` int(2) NOT NULL AUTO_INCREMENT,
 `en_ttl` varchar(50) NOT NULL,
 `year` int(2) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `cls_fee` (
 `id` int(2) NOT NULL AUTO_INCREMENT,
 `c_id` int(2) NOT NULL,
 `s_id` int(2) NOT NULL,
 `fee_id` int(2) NOT NULL,
 `fee` int(6) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `fee` (`c_id`,`s_id`,`fee_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

CREATE TABLE `invoice` (
 `id` int(4) NOT NULL AUTO_INCREMENT,
 `stu_id` int(4) NOT NULL,
 `fee_id` int(11) NOT NULL,
 `ftm_id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

1 Ответ

0 голосов
/ 04 октября 2018

использовать studentid = 1 в ключе

    SELECT
    fee_tm.id AS ftm_d,
    fee.id AS f_id,
    fee_tm.en_ttl AS f_tm,
    fee.en_ttl AS fee,
    cls_fee.fee AS f_mnt
    FROM
    fee
inner JOIN
    fee_tm ON fee_tm.year = fee.year and fee.id=fee_tm.id inner join cls_fee on cls_fee.fee_id = fee.id
    LEFT JOIN
    student ON student.cls = cls_fee.c_id AND student.sec = cls_fee.s_id
    left join invoice  ON invoice.stu_id = student.id AND invoice.fee_id = fee.id AND invoice.ftm_id = fee_tm.id and student.id=1
    where invoice.fee_id is null
...