host oid
192.168.0.2 1
192.168.0.2 1
192.168.0.2 1
192.168.0.2 2
192.168.0.2 2
192.168.0.4 13
192.168.0.4 13
192.168.0.5 4
192.168.0.5 4
192.168.0.13 5
192.168.0.4 7
192.168.0.6 22
Таблица allowdev
host oid
192.168.0.2 1
192.168.0.2 2
192.168.0.4 13
192.168.0.5 4
192.168.0.13 5
192.168.0.4 7
192.168.0.6 22
Нужно выбрать все записи из таблицы Traphistory (включая дубликаты) кроме тех, которые есть в таблице allowdev.
В таблице Traphistory - записей несколько сотен и они не уникальны (есть дубликаты). В таблице allowdev записи уникальны.
Пока что родил вот такой запрос, но как то он не так отрабатвает вроде ((
[sql]
SELECT * FROM traphistory
WHERE host <> (SELECT host FROM allowdev WHERE oid='oid.traphistory' AND host='host.traphistory');
[sql]
что в нем не так?
Спустя 36 минут, 36 секунд (16.11.2010 - 13:15) sergeiss написал(а):
Вместо знака "не равно" надо написать "not in":
И учти, что такой запрос может выполняться достаточно долго.
PS. Насчет кавычек в твоём запросе не понял. То они есть, то их нету... Ты уж определись окончательно, как писать.
WHERE host not in (SELECT ....
И учти, что такой запрос может выполняться достаточно долго.
PS. Насчет кавычек в твоём запросе не понял. То они есть, то их нету... Ты уж определись окончательно, как писать.
Спустя 23 секунды (16.11.2010 - 13:15) pas написал(а):
oid - PK - в allowdev?
SELECT trh.*
FROM traphistory trh, allowdev ad
WHERE trh.oid <> ad.oid;
Спустя 4 минуты, 5 секунд (16.11.2010 - 13:19) sergeiss написал(а):
pas - неверный пример!!! Так будет получено много данных, из которых бОльшая часть будет неверная.
Спустя 3 минуты, 43 секунды (16.11.2010 - 13:23) pas написал(а):
sergeiss
а если дописать?
P.S. Просто хочу понять свою ошибку
а если дописать?
SELECT trh.*
FROM traphistory trh, allowdev ad
WHERE trh.oid <> ad.oid
AND trh.host <> ad.host;
P.S. Просто хочу понять свою ошибку
Спустя 4 минуты, 11 секунд (16.11.2010 - 13:27) sergeiss написал(а):
Цитата (pas @ 16.11.2010 - 14:23) |
P.S. Просто хочу понять свою ошибку |
ОК, смотри внимательно.
Что делает такая выборка?
SELECT trh.*
FROM traphistory trh, allowdev ad
Отвечаю: она выбирает все возможные комбинации (сочетания строк) из обеих таблиц. Если в первой будет 20 строк, а во второй 35, то общее количество строк в выборке будет = 20*35=700. А должно быть всяко не больше 35!!! Потому что больше неоткуда взяться.
Для выборки только нужных строк и требуются условия.
Указанное же тобой условие будет выполняться для бОльшей части комбинаций строк, поэтому в выборке будет много больше 35 строк.
Понятно так?
Спустя 12 минут, 54 секунды (16.11.2010 - 13:40) __romka_ написал(а):
sergeiss
спасибо!
И меня очень волнует вопрос медленного выполнения.
Но это же все равно будет быстрее чем, средставми php делать выборку и на каждый элемент массива делать запрос к allowdev и исключать записи по одной?
Или как тут еще можно поступить? может быть создавать временную таблицу?
спасибо!
И меня очень волнует вопрос медленного выполнения.
Но это же все равно будет быстрее чем, средставми php делать выборку и на каждый элемент массива делать запрос к allowdev и исключать записи по одной?
Или как тут еще можно поступить? может быть создавать временную таблицу?
Спустя 52 минуты, 38 секунд (16.11.2010 - 14:33) linker написал(а):
Люди, окститесь
SELECT * FROM `traphistory` AS `trp`
LEFT JOIN `allowdev` AS `alw` ON `alw`.`oid` = `trp`.`oid`
WHERE `alw`.`oid` IS NULL