[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из таблицы, по условию
__romka_
Таблица traphistory

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":
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

а если дописать?


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 и исключать записи по одной?

Или как тут еще можно поступить? может быть создавать временную таблицу?

Спустя 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
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.