выборка данных из таблицы без значений из другой таблицы

naumov

Новичок
выборка данных из таблицы без значений из другой таблицы

есть две таблицы. в первой список софта. вторая таблица состоит из одного поля name и содержит исключения, которые НЕ нужно выбирать из первой таблицы. цель - исключить при просмотре инвентаризационных данных записи типа "Security update for Windows XP (KB000000)" по подстроке "Security update".
mysql 5.0

как я себе представлял запрос:
PHP:
SELECT * FROM `softwares` WHERE name not like (select concat('%',name,'%') from softwares_noselect);
но это не катит, т.к. вложенный селект возвращает несколько записей. пробую использовать "WHERE name not IN (select...", но возвращается примерно то же количество строк, что и в самой таблице SOFTWARES.

как сделать подобный запрос силами SQL, если это возможно?

ЗЫ
сейчас у меня этот запрос строится в два этапа и силами ПХП. сначала выбираются исключения, строится условие WHERE, и уже потом выбираются данные и таблицы софта.
 

iceman

говнокодер
naumov
о_О

PHP:
SELECT t.* FROM softwares t WHERE not exists(
  SELECT x.* FROM software_noselect x WHERE x.software_id = t.software_id
)
нуна по ИД делать исключения...

ну если говнокодить... то должно это работать:

PHP:
SELECT t.* FROM softwares t WHERE not exists(
  SELECT x.* FROM software_noselect x  WHERE upper(x.name) like upper(t.name) || '%'
)
 

naumov

Новичок
во второй таблице одно поле. смысла там что-то добавлять я не вижу, т.к. в первой таблице у одного наименования софта может может быть несколько ID.

задача как раз по подстроке из наименования софта исключать.

второй вариант тоже не работает.

у меня сейчас работает такой запрос:

PHP:
SELECT id,name,publisher,COUNT(name) AS qty 
FROM softwares 
WHERE name NOT LIKE '%Hotfix%' 
AND name NOT LIKE '%Пакет исправлений%' 
AND name NOT LIKE '%update%' 
AND name NOT LIKE '%Обновление%' 
AND name NOT LIKE '%Пакет обновления%' 
AND name NOT LIKE '%Security Update%'
GROUP BY name ORDER BY name;
-~{}~ 26.06.10 17:39:

на данный момент первая таблица имеет следущуб структуру:
PHP:
CREATE TABLE `softwares` (
 `ID` int(11) NOT NULL auto_increment,
 `HARDWARE_ID` int(11) NOT NULL,
 `PUBLISHER` varchar(255) default NULL,
 `NAME` varchar(255) default NULL,
 `VERSION` varchar(255) default NULL,
 `FOLDER` text,
 `COMMENTS` text,
 `FILENAME` varchar(255) default NULL,
 `FILESIZE` int(11) default '0',
 `SOURCE` int(11) default NULL,
 `FROM` varchar(64) NOT NULL,
 PRIMARY KEY  (`HARDWARE_ID`,`ID`),
 KEY `NAME` (`NAME`),
 KEY `VERSION` (`VERSION`),
 KEY `ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=645430 DEFAULT CHARSET=latin1
 

iceman

говнокодер
PHP:
SELECT t.* FROM softwares t WHERE not exists(
  SELECT x.* FROM software_noselect x  WHERE upper(x.name) like '%' || upper(t.name) || '%'
)
а поиграться в данном запросе с NOT (убрать, подставить) пробывал?

> `NAME` varchar(255) default NULL
default NULL - убери...

PHP:
SELECT t.* FROM softwares as t WHERE not exists(
  SELECT x.* FROM software_noselect as x  WHERE instr(upper(x.name), upper(t.name)) > 0
)
> второй вариант тоже не работает.
не работает - 0 строк? или синтаксическая ошибка?
 

naumov

Новичок
извиняюсь за долгую неактивность. был в отпуске без доступа к компу :)
не работает - 0 строк? или синтаксическая ошибка?
выдает результат, по объему сопоставимый с содержимым всей таблицы "softwares"
про остальное отвечу чуть позже

-~{}~ 12.07.10 14:03:

поискал на тему использования конструкции (not)exists.
пишут что результат подзапроса не используется, а важно только был ли вывод от подзапроса или нет.
"Однако, в принципе он мало отличается при выборе
EXISTS столбцов, или когда выбираются все столбцы, потому что он просто замечает - выполняется или нет вывод из подзапроса - а не использует выведенные значения." (http://www.mysql.ru/docs/gruber/mg12.html)

похоже эта конструкция тут неприменима. а подобную выборку можно получить через джойны?
 

iceman

говнокодер
если подумать головой, то и EXISTS можно использовать как условие, рассчитывая на то что вернеца подзапрос или нет...

и еxists работает быстрее чем in, я его чаще использую...
 
Сверху