2012-12-04 45 views
1

我一直在爲一個電話呼叫建立一個數據庫項目,這裏是對圖的快速查看,callid在呼叫表中自動增加,sessionid在會話表中自動遞增,這種方式三方通話的通話具有相同的圖表。我在虛擬數據進入了各個領域,除了sessionstarttime和SESSIONEND時間Phonecall數據庫SQL查詢

使用phpMyAdmin,

我的問題:我需要做一個查詢,這將使我的計費時間爲客戶又名一個PhoneNumber。

實施例電話

A - > B,從12:00 PM到1:00 PM

乙 - >從12:30 PM C至1:30 PM

A應被收取1小時

乙應該被收取1 1/2小時(1:30小時)

C必須被計費1小時

另一個實施例 A - >乙12:00 PM到1:00 PM A - >Ç12:30 PM到1:30 PM

A應被收取1 1/2小時(1:30小時)

乙應該被收取1小時

C必須被計費1小時

這裏在給定的數據格式

- <table name="Account"> 
     <column name="AccountID">1</column> 
     <column name="AcctHolderNum">617-100-5001</column> 
     <column name="ProviderID">1</column> 
     </table> 

    <table name="call"> 
     <column name="callID">4</column> 
     <column name="callSender">617-719-9000</column> 
     <column name="callReceiver">617-730-8100</column> 
     <column name="callStartTime">2012-11-06 06:44:50</column> 
     <column name="callEndTime">2012-11-06 06:55:50</column> 
     <column name="sessionID">1</column> 

    - <table name="phoneNum"> 
     <column name="phoneNum">617-300-2000</column> 
     <column name="phoneNumFN">Nigel</column> 
     <column name="phoneNumLN">Thornberry</column> 
     <column name="PhoneAccountID">2</column> 

    - <table name="Provider"> 
     <column name="ProviderID">1</column> 
     <column name="ProviderName">T-Mobile</column> 
     </table> 

    - <table name="session"> 
     <column name="sessionID">1</column> 
     <column name="sessionStartTime">2012-11-06 06:44:50</column> 
     <column name="sessionEndTime">2012-11-06 06:55:50</column> 

這裏是ER圖

http://i.stack.imgur.com/rrh4B.jpg

這裏是我開始思考,但淹沒自己在混亂中試圖使一個查詢適合所有可能的輸入呼叫表中

FROM `call` as `call1`, `call` as `call2`, `call` as `call3` 
    WHERE `call1.sessionid` = `call2.sessionid` = `call3.sessionid` 
    AND <REST OF STUFF> 
    UNION /* not union all, but union*/ 
    SELECT same as above but for three way calls 
    FROM `call` as `call1`, `call` as `call2`, 
    WHERE `call1.sessionid` = `call2.sessionid` 
    AND <REST OF STUFF> 
    UNION 
    SELECT same as above but for two way calls 
    FROM `call` 
    WHERE <REST OF STUFF> 

另外這裏僅供參考

每個呼叫的

計算長度

SELECT TIMEDIFF(MIN(`callStartTime`), MAX(`callEndTime`)) 
    FROM `call` GROUP BY `callID` 
幾個簡單的查詢

每個會話的計算長度

SELECT TIMEDIFF(MIN(`callStartTime`), MAX(`callEndTime`)) 
    FROM `call` GROUP BY `sessionID` 

通話分鐘通過賬戶進行(注callsender)

通過賬戶收到(注callreciever)調用的
SELECT SUM(TIMEDIFF(`callStartTime`, `callEndTime`)) 
    FROM `call`, `Phonenum` 
    WHERE `phoneNum.phoneNum` = `call.callSender` 
    GROUP BY `phoneAccountID` 

分鐘

SELECT SUM(TIMEDIFF(`callStartTime`, `callEndTime`)) 
    FROM `call`, `Phonenum` 
    WHERE `phoneNum.phoneNum` = `call.callReciever` GROUP BY `phoneAccountID` 

這裏是模式的xml輸出

- <pma:structure_schemas> 
    - <pma:database name="jr_Team5" collation="utf8_general_ci" charset="utf8"> 
     <pma:table name="Account">CREATE TABLE `Account` (`AccountID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI Primary Key', `AcctHolderNum` varchar(50) NOT NULL COMMENT 'Account Holder''s Phone Number i.e. "617-100-5001"', `ProviderID` int(11) DEFAULT NULL COMMENT 'Foreign Key from "ProviderID"', PRIMARY KEY (`AccountID`), KEY `AcctHolderNum` (`AcctHolderNum`), KEY `ProviderID` (`ProviderID`), CONSTRAINT `Account_ibfk_1` FOREIGN KEY (`ProviderID`) REFERENCES `Provider` (`ProviderID`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;</pma:table> 
     <pma:table name="call">CREATE TABLE `call` (`callID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI Primary Key', `callSender` varchar(50) NOT NULL COMMENT 'Phone Number of Caller', `callReceiver` varchar(50) NOT NULL COMMENT 'Phone Number of Reciever', `callStartTime` datetime NOT NULL COMMENT 'Time Call Begins', `callEndTime` datetime NOT NULL COMMENT 'Time Call Ends', `sessionID` int(11) NOT NULL COMMENT 'Foreign Key from "SessionID"', PRIMARY KEY (`callID`), KEY `callSender` (`callSender`), KEY `callReceiver` (`callReceiver`), KEY `sessionID` (`sessionID`), CONSTRAINT `call_ibfk_1` FOREIGN KEY (`callSender`) REFERENCES `phoneNum` (`phoneNum`), CONSTRAINT `call_ibfk_2` FOREIGN KEY (`callReceiver`) REFERENCES `phoneNum` (`phoneNum`), CONSTRAINT `call_ibfk_3` FOREIGN KEY (`sessionID`) REFERENCES `session` (`sessionID`)) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;</pma:table> 
     <pma:table name="phoneNum">CREATE TABLE `phoneNum` (`phoneNum` varchar(50) NOT NULL COMMENT 'Phone Number on Record', `phoneNumFN` varchar(50) DEFAULT NULL COMMENT 'First Name of Phone User', `phoneNumLN` varchar(100) DEFAULT NULL COMMENT 'Last Name of Phone User', `PhoneAccountID` int(11) DEFAULT NULL COMMENT 'Foreign Key from "AccountID"', PRIMARY KEY (`phoneNum`), KEY `PhoneAccountID` (`PhoneAccountID`), CONSTRAINT `phoneNum_ibfk_1` FOREIGN KEY (`PhoneAccountID`) REFERENCES `Account` (`AccountID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pma:table> 
     <pma:table name="Provider">CREATE TABLE `Provider` (`ProviderID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI Primary Key', `ProviderName` varchar(50) NOT NULL COMMENT 'Network Provider i.e. "Verizon" or "Sprint"', PRIMARY KEY (`ProviderID`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;</pma:table> 
     <pma:table name="session">CREATE TABLE `session` (`sessionID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'AI Primary Key', `sessionStartTime` datetime DEFAULT NULL COMMENT 'Session Begin Time', `sessionEndTime` datetime DEFAULT NULL COMMENT 'Session End Time', PRIMARY KEY (`sessionID`)) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;</pma:table> 
     </pma:database> 
     </pma:structure_schemas> 

感謝您的幫助提前,任何幫助/輸入/方向,將不勝感激,讓我知道,如果你對這個數據庫

在XML

Fourway呼叫數據例如

- <table name="call"> 
     <column name="callID">40</column> 
     <column name="callSender">617-292-1309</column> 
     <column name="callReceiver">617-300-2000</column> 
     <column name="callStartTime">2012-10-31 09:07:35</column> 
     <column name="callEndTime">2012-10-31 11:07:35</column> 
     <column name="sessionID">7</column> 
     </table> 
    - <table name="call"> 
     <column name="callID">41</column> 
     <column name="callSender">617-300-2000</column> 
     <column name="callReceiver">617-234-1234</column> 
     <column name="callStartTime">2012-10-31 09:37:35</column> 
     <column name="callEndTime">2012-10-31 12:37:35</column> 
     <column name="sessionID">7</column> 
     </table> 
    - <table name="call"> 
     <column name="callID">42</column> 
     <column name="callSender">617-234-1234</column> 
     <column name="callReceiver">617-200-4000</column> 
     <column name="callStartTime">2012-10-31 10:37:35</column> 
     <column name="callEndTime">2012-10-31 11:37:35</column> 
     <column name="sessionID">7</column> 
想到的任何其他複雜查詢的可能
+0

電話通常有一個「to」和一個「from」,就像你的數據結構一樣。你能解釋你有三部電話嗎? –

+0

下面是一個4路呼叫的例子,它有三個條目進入呼叫表,所有的呼叫都在呼叫表中自動遞增,sessionid作爲一個外鍵,在這種情況下,四路呼叫他們都有不同callids,但相同的sessionid – user1876673

+1

這將是很好,使您的問題更普遍。您已經展示了一些努力幷包含了背景信息,這很好,但作爲一般的經驗法則,最好避免使用您的問題域專門定義的術語來提問。換句話說,'我需要做一個查詢,這會給我的客戶aka一個電話號碼的計費時間'應該更像是:'給出以下表格定義*等等等等等等,我將如何執行以下操作*僞代碼或簡單的英語*' – Sheena

回答

0

我想你在這裏有兩個問題。首先是確定會話中每個來電者分配多少時間。其次是彙總這些信息。

讓我假設一個會話中給定電話號碼的所有時間是連續的。也就是說,從12:00到12:15沒有B - >的呼叫(因爲C不會連續)。然後你就可以得到一個會話中每個用戶的時序:

select c.sessionid, c.caller, 
     (max(c.EndTime) - min(c.StartTime)) as dur 
from ((select c.sessionid, c.callSender as caller, c.StartTime, c.EndTime 
     from call c 
    ) union all 
     (select c.sessionid, c.callReceiver, c.StartTime, c.EndTime 
     from call c 
    ) 
    ) c 
    on s.sessionid = c.sessionid 
group by c.sessionid, c.caller 

從此,你就可以在彙總所有會話。

如果會話內的通話時間不連續,則問題更具挑戰性。解決此問題的最佳方法取決於數據庫和數據庫中可用的功能。

+0

首先讓我感謝你,但如果我可以糾纏你一些澄清的問題,這將是偉大的。 1. c.sessionid真的應該是call.session id嗎?和s.sessionid被session.sessionid 2. c.caller什麼應該說是我沒有,作爲一個外地 3.當你從呼叫c的使用短語 什麼你這是 4意思。當你的意思是連續的,你的意思是沒有重疊的電話呼叫意味着暫停某人?如果是這樣,我特意輸入數據,因此使用多個日期沒有重疊 – user1876673