невозможно выбрать с помощью вложенного запроса в предложении where

#mysql

#mysql

Вопрос:

Сначала я хочу выбрать некоторый столбец из bill_client и одну форму столбца bill_pkg , и это просто, как показано ниже:

Запрос:

 SELECT c.company_id, c.client_id, p.pkg_rate
FROM bill_client c
JOIN bill_pkg p on c.pkg_id=p.pkg_id
WHERE c.status=1
  

Я действительно пытаюсь выбрать с помощью where extract(year_month from curdate())>

 SELECT c.company_id, c.client_id, p.pkg_rate
FROM bill_client c
JOIN bill_pkg p on c.pkg_id=p.pkg_id
WHERE c.status=1 and extract(year_month from curdate())>
 (SELECT MAX(due_month)
 FROM bill_rent
 WHERE c.client_id=client_id and c.company_id=company_id
 GROUP BY client_id, company_id)
  

Но этот запрос возвращает только те строки, которые client_id соответствуют bill_rent таблице, а не все строки из bill_client таблицы. Мне нужно проверить это company_id с client_id bill_rent помощью столбца таблицы exist yet due_month для текущего месяца. Любая помощь, пожалуйста.

Вот схема таблицы:

tabll:bill_client

 CREATE TABLE `bill_client` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `client_id` varchar(30) NOT NULL,
 `client_name` varchar(50) NOT NULL,
 `address` varchar(100) NOT NULL,
 `opening_balance` decimal(10,2) NOT NULL,
 `conn_charge` decimal(13,2) NOT NULL,
 `con_date` date NOT NULL,
 `mobile` varchar(12) NOT NULL,
 `pkg_id` int(11) NOT NULL,
 `conn_type` int(11) NOT NULL,
 `status` tinyint(1) NOT NULL DEFAULT '1',
 `area_id` int(11) NOT NULL,
 `managed_by` int(11) NOT NULL,
 `remarks` varchar(100) NOT NULL,
 `photo` varchar(50) DEFAULT NULL,
 `company_id` varchar(15) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=165 DEFAULT CHARSET=utf8
  

таблица: bill_pkg

 CREATE TABLE `bill_pkg` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `pkg_id` int(11) NOT NULL,
 `pkg_name` varchar(10) NOT NULL,
 `pkg_rate` decimal(10,0) NOT NULL,
 `company_id` varchar(15) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `pkg_name` (`pkg_name`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8
  

таблица: bill_rent

 CREATE TABLE `bill_rent` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `company_id` varchar(15) NOT NULL,
 `client_id` varchar(10) NOT NULL,
 `due_month` varchar(6) NOT NULL,
 `pay_date` date NOT NULL,
 `amount_due` decimal(10,2) NOT NULL,
 `amount_paid` decimal(10,2) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
  

Комментарии:

1. Извините, я не понимаю, что вам нужно. Пожалуйста, предоставьте некоторые примерные данные, ожидаемые результаты на основе выборочных данных и фактические результаты, полученные вашим запросом.

Ответ №1:

Если client_id не соответствует bill_rent таблице, MAX(due_month) будет NULL , поэтому сравнение текущего месяца с этим не удастся. Используйте IFNULL(MAX(due_month), '') так, чтобы вы всегда получали допустимое значение для сравнения.

 SELECT c.company_id, c.client_id, p.pkg_rate
FROM bill_client c
JOIN bill_pkg p on c.pkg_id=p.pkg_id
WHERE c.status=1 and extract(year_month from curdate())>
 (SELECT IFNULL(MAX(due_month), '')
 FROM bill_rent
 WHERE c.client_id=client_id and c.company_id=company_id)
  

Комментарии:

1. он по-прежнему возвращает только совпадение client_id с bill_rent , я пытаюсь для всех строк из bill_client where max(due_month) null и extract(year_month from curdate())> max(due_month)

2. Можете ли вы создать sqlfiddle с образцами данных?

3. Кстати, вам не нужен GROUP BY подзапрос, поскольку он выбирает только одного клиента и компанию.

4. да, на самом деле это не здесь. group by и сейчас это работает. Большое вам спасибо.