#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
wheremax(due_month) null
иextract(year_month from curdate())> max(due_month)
2. Можете ли вы создать sqlfiddle с образцами данных?
3. Кстати, вам не нужен
GROUP BY
подзапрос, поскольку он выбирает только одного клиента и компанию.4. да, на самом деле это не здесь.
group by
и сейчас это работает. Большое вам спасибо.