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

Тема в разделе "Базы данных", создана пользователем modelsonline, 15 апр 2011.

Модераторы: latteo
  1. modelsonline

    modelsonline Постоялец

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

    требуемое условие - значение поля ip в таблице source не существует в ip таблицы filter для данного id
     
  2. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    select * from source, filter where условия and (source.id=filter.id and source.ip<>filter.ip)

    оно?
     
  3. modelsonline

    modelsonline Постоялец

    Регистр.:
    18 окт 2010
    Сообщения:
    103
    Симпатии:
    9
    не пашет, не силен я в таких запросах
    видимо потому что 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';
     
  4. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    266
    Сделай небольшой дамп этих таблиц (штук 10 значений) и напиши что хочешь выбать из них (чтобы делал, если бы ручками выбирал данные из этих таблиц.)
     
  5. modelsonline

    modelsonline Постоялец

    Регистр.:
    18 окт 2010
    Сообщения:
    103
    Симпатии:
    9
    дампы дать не могу, но вкратце
    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, но я не умею (
     
  6. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    266
    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)
     
  7. modelsonline

    modelsonline Постоялец

    Регистр.:
    18 окт 2010
    Сообщения:
    103
    Симпатии:
    9
    да нет же, уже этот запрос
    SELECT sourse.id
    FROM source, filter
    WHERE
    filter.user_id = '1'
    не видит результат

    нельзя
    SELECT sourse.id
    FROM source, filter
    я все перепробовал (
     
  8. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    266
    Выложите кусок дампа базы 5 -10 строчек и саму структуду бд. (если, например с помощью phpmyadmin делать бекап, то он сначала создает структуру.)

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

    Например так AND source.ip=filter.ip
     
  9. modelsonline

    modelsonline Постоялец

    Регистр.:
    18 окт 2010
    Сообщения:
    103
    Симпатии:
    9
    В filter может НЕ БЫТЬ данных. Вы мне про классический вариант говорите, который в мануале описан, я это уже пробовал, если данных в filter нет, то ничего не выводится а должно быть наборот. Таблица filter исключает поля, если фильтра нет, то результат должен быть из source без исключений.

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

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

    mysqlcreate table filter (user_id integerip int(11), data varchar(100));
    Query OK0 rows affected (0.11 sec)

    mysqlselect from filter
    +---------+-------+---------+
    user_id ip    data    |
    +---------+-------+---------+
    |       
    |  7777 data123 
    |       
    |  5432 dat123  
    |       
    |  4567 da123   
    |       
    |  7777 dda123  
    |       
    12345 da123   
    +---------+-------+---------+
    5 rows in set (0.00 sec)

    mysqlselect 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)

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

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

    выводит, но не то что нужно
     
  10. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    Проверь такой вариант:
    PHP:
    SELECT FROM source WHERE ip NOT IN(SELECT filter.ip FROM filter WHERE filter.user_id ) AND params 'lalala'
    У меня выдало
     
    modelsonline нравится это.