全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:906
推到 Plurk!
推到 Facebook!

不知道如何下query

尚未結案
coolsula
一般會員


發表:2
回覆:4
積分:1
註冊:2004-11-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-14 21:28:18 IP:140.126.xxx.xxx 未訂閱
各位大大: 小弟寫一個判斷中毒電腦的IP 現在有一個資料庫 裡面有來源ip(Sip),目的ip(Dip),來源port(Sp),package size(pk)等欄位 如果可以找出固定來源IP透過相同的port送出相同大小的package size給不一樣的目的ip,如果找出符合條件且不一樣目的Ip超過100個時 就判斷這Ip有可能中毒 請問要怎麼做 因為我現在做出一個很笨的做法速度很慢 就是先找出有多少不一樣的Sip把他存成陣列A 再利用迴圈找出Sip透過幾個SP另存陣列B 在包另一成迴圈找出透過這個SP送出不一樣的pk有幾種再另存陣列B 最後最裡層去下query指令Select * from Sip=A and Sp=B and pk=C 因為這個資料庫有50幾萬筆資料 我用這方法去找出我要的答案 程式需要跑很久 想要有沒有可以一次下query指令可以直接完成 不知道是不適合用巢狀式QUERY 或是還有其他方法可以 @@ 拜託各位大大了
coolsula
一般會員


發表:2
回覆:4
積分:1
註冊:2004-11-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-14 21:34:11 IP:140.126.xxx.xxx 未訂閱
假設我已經把有幾種來源IP存成一個Sip.txt 內容為: 1.1.1.1 2.2.2.2 101.11.123.212 我把程式碼po出來看有沒有是哪邊可以用別種方法去替代       String sql="";   TStringList *sl = new TStringList;         sl->LoadFromFile("Sip.txt"); int SpC=0,pkC=0; String *Sip = new String[sl->Count]; for(int i=0;iCount;i )Sip[i]=sl->Strings[i]; for(int i=0;iCount;i ) { Memo2->Lines->Add(IntToStr(i)); Memo2->Lines->Add(Sip[i]); ADOQuery1->SQL->Clear(); sql="select DISTINCT SrcP from net where SrcIPaddress='" Sip[i] "'"; ADOQuery1->SQL->Add(sql); ADOQuery1->Close(); ADOQuery1->Open(); SpC=DBGrid1->DataSource->DataSet->RecordCount; String *Sp = new String[SpC]; for(int j=0;!ADOQuery1->Eof;j ) { Sp[j]=ADOQuery1->Fields->Fields[0]->AsString; ADOQuery1->Next(); } for(int j=0;jLines->Add("Sport =" Sp[j]); ADOQuery1->SQL->Clear(); sql="select DISTINCT Pkts from net where SrcIPaddress='" Sip[i] "' and SrcP='" Sp[j] "'"; ADOQuery1->SQL->Add(sql); ADOQuery1->Close(); ADOQuery1->Open(); pkC=DBGrid1->DataSource->DataSet->RecordCount; String *pk = new String[pkC]; for(int k=0;!ADOQuery1->Eof;k ) { pk[k]=ADOQuery1->Fields->Fields[0]->AsString; ADOQuery1->Next(); } for(int k=0;kLines->Add("package =" pk[k]); ADOQuery1->SQL->Clear(); sql="select DISTINCT DstIPaddress,Pkts,SrcP from net where SrcIPaddress='" Sip[i] "' and SrcP='" Sp[j] "' and Pkts='" pk[k] "'"; ADOQuery1->SQL->Add(sql); ADOQuery1->Close(); ADOQuery1->Open(); if(DBGrid1->DataSource->DataSet->RecordCount>30)Memo1->Lines->Add(Sip[i]); } delete[] pk; } delete[] Sp; } delete[] Sip;
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-14 21:45:25 IP:220.132.xxx.xxx 未訂閱
Hi, try this one, select sip, sp, pk, count(distinct(dip)) from tableX group by sip, sp, pk having count(distinct(dip)) > 100
coolsula
一般會員


發表:2
回覆:4
積分:1
註冊:2004-11-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-14 23:59:53 IP:211.76.xxx.xxx 未訂閱
select sip, sp, pk, count(distinct(dip)) from tableX group by sip, sp, pk having count(distinct(dip)) > 100 這個做法可以耶 但我也不知道是不是我要的答案 我得去check一下 我想了解這個sql的敘述是什麼 能請timhuang大大說明一下嗎!?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-15 00:33:13 IP:220.132.xxx.xxx 未訂閱
這個 sql command 的意思是: 一樣的 sip, 一樣的 sp, 一樣的 pk, 計算出不同的 dip 數, 而這些不同的 dip 總數大於 100 group by 就是以該欄位為分群的意思. count 是計數 distict 是判別不同 having 是在有集總函數(aggregate function, ex: sum, count..)下的條件!! 這樣寫清楚嗎?
系統時間:2024-06-30 2:32:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!