2013-12-11 219 views
3

選擇不同值對我有具有表結構如下從SQLite數據庫

塔1 SQLite數據庫:源IP
塔2:源端口
柱3:目的地IP
柱4:目的端口
柱5:協議
柱6:類型

表中的快照看起來像這樣

╔═══╦══════╦═══╦═════╦═════╦═══╗ 
║ A ║ 444 ║ B ║ 555 ║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ B ║ 555 ║ A ║ 444 ║ TCP ║ 1 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ C ║ 100 ║ A ║ 5525║ UDP ║ 1 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ B ║ 5222 ║ C ║ 2552║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ A ║ 5525 ║ C ║ 100 ║ UDP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ C ║ 2552 ║ B ║ 5222║ TCP ║ 1 ║ 
╚═══╩══════╩═══╩═════╩═════╩═══╝ 

在上述表格中,您可以看到(A,444),(B,555)和(B,555),(A,444)都有條目。 我想選擇的不同的[(源IP,源端口),(目的地IP,目的地端口),(協議)]即,i想要查詢,給出了一個輸出如下預先

╔═══╦══════╦═══╦═════╦═════╦═══╗ 
║ A ║ 444 ║ B ║ 555 ║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ B ║ 5222 ║ C ║ 2552║ TCP ║ 2 ║ 
╠═══╬══════╬═══╬═════╬═════╬═══╣ 
║ C ║ 100 ║ A ║ 5525║ UDP ║ 1 ║ 
╚═══╩══════╩═══╩═════╩═════╩═══╝ 

由於

+0

'type'列的含義是什麼? –

+0

我基於兩個系統之間的通信對交通數據進行分類。類型字段用於指定。@ CL。 – swamy

回答

3

下面會做什麼:

SELECT *, 
    source_ip<destination_ip OR source_ip=destination_ip AND source_port<destination_port AS _asc 
FROM _table 
GROUP BY 
    CASE WHEN _asc THEN source_ip ELSE destination_ip END, 
    CASE WHEN _asc THEN source_port ELSE destination_port END, 
    CASE WHEN _asc THEN destination_ip ELSE source_ip END, 
    CASE WHEN _asc THEN destination_port ELSE source_port END; 

編輯:按照您的編輯...

SELECT * 
FROM (
    SELECT *, 
     source_ip<destination_ip OR source_ip=destination_ip AND source_port<destination_port AS _asc 
    FROM _table 
    ORDER BY ROWID DESC 
) 
GROUP BY 
    CASE WHEN _asc THEN source_ip ELSE destination_ip END, 
    CASE WHEN _asc THEN source_port ELSE destination_port END, 
    CASE WHEN _asc THEN destination_ip ELSE source_ip END, 
    CASE WHEN _asc THEN destination_port ELSE source_port END; 

MAY工作,

  1. 「第一行」 使得在數據庫方面沒有任何意義,因爲ROWID可能會改變。 「第一」僅在應用於列時是有意義的,例如, 「第一個端口號」或「按日期添加」 - 這意味着您可能需要另一列。

  2. 儘管SQLite接口爲每個組選擇最後一行(對於未聚合的表達式),但不保證此行爲將被維護或在各個版本之間保持一致。

登記SQL Fiddle

+0

你可以再次看看這個問題。我修改了這個要求,它在編輯摘要中。對不起,混淆了@LS_dev – swamy

+1

這是一個不同的問題。無論如何,「第一行」在數據庫中沒有意義,因爲行數據庫的順序可能會改變。有意義的是「首先按......排序」。 –