2013-03-14 2 views
1

У меня есть набор таблиц для сбора, из которых я пытаюсь найти количество различных ip-адресов (ip) между двумя разными черными списками (typeId) - в основном пересекают таблицу для себя. однако мой запрос о присоединении к таблице сам по себе дает странные результаты.SQL присоединиться к самим таблицам для предоставления неполных результатов

sqlite> .schema 
CREATE TABLE feedz_ip2 (fileId INTEGER NOT NULL, ip NUMERIC, utime INT, typeId INTEGER); 
CREATE TABLE feedz_ip_types (typeId INTEGER PRIMARY KEY, type STRING UNIQUE); 
CREATE INDEX ip_id ON feedz_ip2(ip); 
CREATE INDEX types_id ON feedz_ip2(typeId); 
sqlite> select * from feedz_ip2 limit 4; 
1|86176256|1347929568|2 
1|247463936|1347929568|2 
1|247476224|1347929568|2 
1|247478272|1347929568|2 
sqlite> select * from feedz_ip_types; 

1 | malwaredomains 
2 | spamhaus 
3 | badipset 
4 | abuse.ch 
5 | malwarepatrol 

sqlite> select a.typeId, b.typeId, count(a.ip) 
      from feedz_ip2 a 
    inner join feedz_ip2 b on a.typeId != b.typeId and a.ip=b.ip 
     ; 

5 | 3 | 9265512 

То, что я ищу действительно должна быть пересечением для всех различных списков

1|3|200 
1|5|900 
2|3|300 

Если нет пересечения или общего IP-адреса тех, сочетание столбца не перечислит.

Я не знаю, если запрос действительно сбивает с толку в SQLite или я запутался ..

+0

http://sqlfiddle.com/#!7/aed94/1/0, вы уверены, что показываете точный результат, который вы получаете от этого запроса? –

+1

Можете ли вы опубликовать содержимое таблицы, которое вы самосоединяетесь (т. Е. 'Feedz_ip2')? Вы только разместили 'feedz_IP_types', который, по-видимому, не имеет отношения к вашему вопросу. –

+0

Извините, не было группы по заявлению в первом наборе результатов .. Я обновил запрос .. выше sqlite> выберите a.typeId, b.typeId, count (a.ip) from feedz_ip2 внутреннее соединение feedz_ip2 b on a.typeId! = b.typeId и a.ip = b.ip; 5 | 3 | 9265512 – Vijay

ответ

0

Хорошо нашел решение:

select a.typeId, b.typeId, count(*) from feedz_ip2 a inner join feedz_ip2 b on a.typeId != b.typeId and a.ip=b.ip group by a.typeId,b.typeId; 
+--------+--------+----------+ 
| typeId | typeId | count(*) | 
+--------+--------+----------+ 
|  1 |  3 | 471718 | 
|  1 |  4 | 3662405 | 
|  1 |  5 | 323609 | 
|  2 |  3 |  426 | 
|  3 |  1 | 471718 | 
|  3 |  2 |  426 | 
|  3 |  4 | 133002 | 
|  3 |  5 | 41596 | 
|  4 |  1 | 3662405 | 
|  4 |  3 | 133002 | 
|  5 |  1 | 323609 | 
|  5 |  3 | 41596 | 
+--------+--------+----------+ 
+0

, вы можете использовать '<' вместо '! =', Чтобы получить только односторонние результаты –

Смежные вопросы