SQL SELECT и JOIN - PullRequest
       16

SQL SELECT и JOIN

0 голосов
/ 09 марта 2019

Привет всем, мне нужно немного помочь в запросе MySQL.У меня есть 2 таблицы, и мне нужно выяснить, какое значение существует в таблице A, а не существует в таблице B, где в таблице B сравниваемые значения должны иметь значение столбца month текущего месяца.

таблица A

+------+
| id   |
+------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
+------+

таблица B

+------+-----+
| id   |Month|
+------+-----+
| 1    |March|
| 2    |March|
| 3    |April|
+------+-----+

Я хочу показать все значения из таблицы A, которых нет в таблице b для апреля месяца.Например, с идентификатора 3 выплачена плата за апрель, но с идентификаторами 1 и 2. нет.

Таблица результатов должна выглядеть следующим образом.

+------+
| id   |
+------+
| 1    |
| 2    |
+------+

Я пробовал несколько запросов, таких как

SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL and B.month=(current date)

и

SELECT * FROM A LEFT JOIN (select * from B where month=(current month)) ON A.id = B.id WHERE B.id IS NULL 

Я не понимаю, что я делаю неправильно в этом.Извините за любые опечатки, так как это было опубликовано на мобильном телефоне.

Ответы [ 3 ]

0 голосов
/ 09 марта 2019

Попробуйте:

SELECT * FROM TableA WHERE id NOT IN (SELECT id FROM TableB)

При этом будут получены все строки из таблицы A, которых нет в таблице B.

Это работает на сервере SQL, но я не уверен насчет MySQL.

0 голосов
/ 09 марта 2019

Я думаю, вам нужно добавить больше условий в таблицу А, потому что в ней нет столбца "месяц".И поскольку ваше значение «месяц» в таблице b является строкой («март» вместо «3»), вы должны также определить это.Вы можете попробовать этот запрос и посмотреть, работает ли он.

SELECT * FROM (SELECT id,MONTH(CURRENT_DATE) AS "curMonth" FROM A) a LEFT JOIN B ON a.id=b.id AND curmonth=MONTHNAME(STR_TO_DATE(b.month,'%b'));

Вы также можете немного поиграть с запросом.Допустим, вы хотите посмотреть предыдущий месяц или месяц вперед, вы можете добавить условие INTERVAL.Это условие также может удовлетворить текущий месяц.

SELECT * FROM (SELECT id,MONTH(DATE_SUB(CURRENT_DATE, INTERVAL 0 MONTH)) AS "curMonth" FROM A) a LEFT JOIN B ON a.id=b.id AND curmonth=MONTHNAME(STR_TO_DATE(b.month,'%b'));

Вы можете изменить на INTERVAL 1 MONTH для данных за предыдущий месяц с текущей даты, INTERVAL 0 MONTH для данных за текущий месяц и INTERVAL -1 MONTH для любых предварительных данных за 1 месяц.

0 голосов
/ 09 марта 2019

Показать все значения из таблицы A, которых нет в таблице b за апрель месяц

select * from A where id not in (select id from B where Month = 'April')
...