Запрос на нахождение "пересечения" таблицы

Dl

Новичок
Запрос на нахождение "пересечения" таблицы

Добрый день!

Суть вопроса:
есть таблица
Код:
CREATE TABLE `g_char` (
  `type_id` int(2) NOT NULL,
  `code` int(6) NOT NULL,
  `note` varchar(255) default NULL,
  PRIMARY KEY  (`type_id`,`code`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
Нужно из нее выбрать все значения `code`, для которых значения `type_id` равны 3,4,5,6 и есть значения `note`, отличные от NULL. Я пытаюсь сделать так:
Код:
SELECT `code` FROM `g_char` WHERE `type_id`=3 AND `note` IS NOT NULL AND
EXISTS (SELECT `code` FROM `g_char` WHERE `type_id`=4 AND `note` IS NOT NULL) AND
EXISTS (SELECT `code` FROM `g_char` WHERE `type_id`=5 AND `note` IS NOT NULL) AND
EXISTS (SELECT `code` FROM `g_char` WHERE `type_id`=6 AND `note` IS NOT NULL)
но в результат попадают записи с `note`=NULL. Как это лучше сделать? Либо делать несколько подзапросов с IN?
 

Dl

Новичок
Сорри, никак не пойму, как тут прикрутить COUNT + GROUP BY :)
В принципе, так работает как надо:
Код:
SELECT `code` FROM `g_char` WHERE `type_id`=3 AND `note` IS NOT NULL AND `code` IN
  (SELECT `code` FROM `g_char` WHERE `type_id`=4 AND `note` IS NOT NULL) AND `code` IN
  (SELECT `code` FROM `g_char` WHERE `type_id`=5 AND `note` IS NOT NULL) AND `code` IN
  (SELECT `code` FROM `g_char` WHERE `type_id`=6 AND `note` IS NOT NULL)
 

zerkms

TDD infected
Команда форума
навскидку, не проверялось:

[sql]
SELECT COUNT(*) AS `cnt`, COUNT(`note`) AS `note_cnt`, `code`
FROM `g_char` WHERE `type_id` IN (3, 4, 5, 6) GROUP BY `code` HAVING `cnt` = 4 AND `note_cnt` > 0
[/sql]
 

zerkms

TDD infected
Команда форума
кстати, судя по твоему запросу - требование:
есть значения `note`, отличные от NULL
не выполняется
у тебя для каждой из записей note не null должен быть
 

Dl

Новичок
Ну, я только учусь)
zerkms
Спасибо! Если исправить >0 на =4, то то, что нужно.
 

zerkms

TDD infected
Команда форума
Dl
хм, если тебе надо, чтобы "во всех записях note было NOT NULL", тогда лучше:

[sql]
SELECT COUNT( * ) AS `cnt` , `code`
FROM `g_char`
WHERE `type_id`
IN ( 3, 4, 5, 6 ) AND `note` IS NOT NULL
GROUP BY `code`
HAVING `cnt` = 4
[/sql]
 

Dl

Новичок
Тогда вот так:
[SQL]SELECT COUNT( `note` ) AS `cnt` , `code`
FROM `g_char`
WHERE `type_id`
IN ( 3, 4, 5, 6 )
GROUP BY `code`
HAVING `cnt` = 4
[/SQL]
 

Gas

может по одной?
Dl
ты хоть понимаешь смысл манипуляций, которые совершаешь?
 

Dl

Новичок
Gas
Ну в принципе, да.
Допустим есть такие строки
Код:
type_id	code	note		
3	600402	1
4	600402	1
5	600402	NULL
6	600402	1
Если делать count(*), то это значение code попадет в выборку, если count(`note`) - то нет. И count(*) тут лишний.
Правильно?
 

Sluggard

Новичок
Dl, найди отличия между твоим запросом и запросом zerkms'а. Разберись, как эти отличия влияют на выборку.
 
Сверху