select объединение таблиц с исключением

modelsonline

Постоялец
Регистрация
18 Окт 2010
Сообщения
94
Реакции
9
Две таблицы есть.
таблица source типа engine = memory (id primary key, ip, data)
таблица filter (id, ip) id, ip - не уники
select * from source where условия and требуемое условие

требуемое условие - значение поля ip в таблице source не существует в ip таблицы filter для данного id
 
select * from source, filter where условия and (source.id=filter.id and source.ip<>filter.ip)

оно?
 
не пашет, не силен я в таких запросах
видимо потому что filter может быть пустой
SELECT * FROM table, filter WHERE property1 = 'value' AND property2 = 'value' AND (filter.user_id = 2 AND table.ip <> filter.user_ip ) ORDER BY RAND() LIMIT 1
поля правильные ошибок нет, таблица filter пустая в table искомые записи есть

даже вот такой запрос не работает
SELECT * FROM table, filter WHERE table.property = 'value';
 
Сделай небольшой дамп этих таблиц (штук 10 значений) и напиши что хочешь выбать из них (чтобы делал, если бы ручками выбирал данные из этих таблиц.)
 
дампы дать не могу, но вкратце
table source (id varchar primary key, ip int(11), params varchar)
a123 | 1231326 | lalala
a124 | 35483283 | blah
a125 | 123552 | blalala
a126 | 1233326 | lalala

table filter (user_id integer, ip int(11), data varchar)
1 | 1231326 | eoijr
1 | 847474 | swrff
2 | 35483283| eswer
2 | 847474 | qp39o

получить хочу данные только из таблицы source
задано filter.user_id = 1 и source.params = lalala

стало быть мне подходят
a123 | 1231326 | lalala
a126 | 1233326 | lalala

но ip есть уже в таблице filter для данного filter.user_id
1 | 1231326 | eoijr

поэтому остается только
a126 | 1233326 | lalala

при этом, если бы ip для данного filter.user_id в таблице не было, я бы получил оба значения
кажется тут что то вроде left join, но я не умею (
 
PHP:
SELECT sourse.id 
FROM source, filter 
WHERE 
filter.user_id = '1' 
AND source.params = 'lalala' 
AND source.ip NOT IN(filter.ip)

Либо в последней строке местами поменять колонки:
PHP:
AND filter.ip NOT IN(source.ip)
 
да нет же, уже этот запрос
SELECT sourse.id
FROM source, filter
WHERE
filter.user_id = '1'
не видит результат

нельзя
SELECT sourse.id
FROM source, filter
я все перепробовал (
 
Выложите кусок дампа базы 5 -10 строчек и саму структуду бд. (если, например с помощью phpmyadmin делать бекап, то он сначала создает структуру.)

SELECT sourse.id
FROM source, filter
WHERE
filter.user_id = '1'
не видит результат

в этом случае таблицы никак не связаны между собою. Нужна связь. Видимо в вашем случае связь идет по колонке ip.

Например так AND source.ip=filter.ip
 
В filter может НЕ БЫТЬ данных. Вы мне про классический вариант говорите, который в мануале описан, я это уже пробовал, если данных в filter нет, то ничего не выводится а должно быть наборот. Таблица filter исключает поля, если фильтра нет, то результат должен быть из source без исключений.

source.id = filter.user_id
это общее поле, но я так понимаю, работать будет только если данные в filter присутствуют

хмм.. можно в пм скинуть? попробовал создать базу filter и source - работает..
PHP:
mysql> create table source (id varchar(2), ip int(11), params varchar(100));
Query OK, 0 rows affected (0.18 sec)

mysql> create table filter (user_id integer, ip int(11), data varchar(100));
Query OK, 0 rows affected (0.11 sec)

mysql> select * from filter; 
+---------+-------+---------+
| user_id | ip    | data    |
+---------+-------+---------+
|       1 |  7777 | data123 | 
|       1 |  5432 | dat123  | 
|       2 |  4567 | da123   | 
|       2 |  7777 | dda123  | 
|       3 | 12345 | da123   | 
+---------+-------+---------+
5 rows in set (0.00 sec)

mysql> select * from source;
+------+-------+--------+
| id   | ip    | params |
+------+-------+--------+
| a1   | 12345 | bla    | 
| a2   | 11111 | bla    | 
| a3   |  2222 | blah   | 
| a4   |  5555 | blah   | 
| a4   |  7777 | boo    | 
+------+-------+--------+
5 rows in set (0.00 sec)

mysql> select source.id from source,filter where filter.user_id = 1 and source.ip not in (filter.ip);
+------+
| id   |
+------+
| a1   | 
| a2   | 
| a3   | 
| a4   | 
| a1   | 
| a2   | 
| a3   | 
| a4   | 
| a4   | 
+------+
9 rows in set (0.00 sec)

mysql> select source.id from source,filter where filter.user_id = 1 and filter.ip not in (source.ip);
+------+
| id   |
+------+
| a1   | 
| a2   | 
| a3   | 
| a4   | 
| a1   | 
| a2   | 
| a3   | 
| a4   | 
| a4   | 
+------+
9 rows in set (0.00 sec)

выводит, но не то что нужно
 
Проверь такой вариант:
PHP:
SELECT * FROM source WHERE ip NOT IN(SELECT filter.ip FROM filter WHERE filter.user_id = 1 ) AND params = 'lalala'
У меня выдало
+------+---------+--------+
| id | ip | params |
+------+---------+--------+
| a126 | 1233326 | lalala |
+------+---------+--------+
1 row in set
 
Назад
Сверху