![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Есть 2 таблицы (Для простоты убрано все ненужное):
CREATE TABLE IF NOT EXISTS `loc2file` (
`lid` int(10) unsigned NOT NULL,
`fid` int(10) unsigned NOT NULL
);
CREATE TABLE IF NOT EXISTS `rus_smartix_files` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
с данными
INSERT INTO `files` (`id`, `name`) VALUES (5, 'name_0'), (6, 'name_1'), (7, 'name_2'), (8, 'name_3');
INSERT INTO `loc2file` (`lid`, `fid`) VALUES (632, 5), (632, 7), (632, 8), (641, 7);
Необходимо сделать такую выборку:
Для каждого елемента из таблицы files определить есть ли в таблице loc2file данный елемент и в этой таблице lid = xxx
пример того, что должен вернуть запрос
Если lid = 632, то
5 1
6 0
7 1
8 1
Если lid = 641, то
5 0
6 0
7 1
8 0
Неактивен
root test > select f.id,count(lid) from files f left join loc2file l on f.id = l.fid where lid = 632 or lid is null group by 1; +----+------------+ | id | count(lid) | +----+------------+ | 5 | 1 | | 6 | 0 | | 7 | 1 | | 8 | 1 | +----+------------+
Неактивен
Спасибо, вот только если выбрать
select f.id, count(lid) from files f left join loc2file l on f.id = l.fid where lid = 641 or lid is null group by 1;
то выборка получится не правильная.
Выведется
6 0
7 1
Вместо
5 0
6 0
7 1
8 0
Неактивен
Ах вот в чем проблема
root test > select f.id,SUM(IF(l.lid = 641, 1, 0)) from files f left join loc2file l on f.id = l.fid GROUP BY 1; +----+----------------------------+ | id | SUM(IF(l.lid = 641, 1, 0)) | +----+----------------------------+ | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 0 | +----+----------------------------+ 4 rows in set (0.00 sec)
Ну или подзапросом.
Неактивен
Спаибо большое.
Неактивен