1

私は電話のデータベースプロジェクトに取り組んでいます。これは図のクイックビューです。callidは呼び出しテーブルで自動インクリメントされ、sessionidはセッションテーブルで自動インクリメントされます。このように、3方向の呼び出しで呼び出しが行われます。同じ図。sessionstarttimeとsessionendtimeを除くすべてのフィールドに架空のデータを入力しました

phpmyadminを使用して、

私の質問:顧客の請求可能な時間を電話番号として指定する1つのクエリを実行する必要があります。

電話の例

A-> B12:00PMから1:00PM

B->C午後12時30分から午後1時30分まで

Aは1時間請求する必要があります

Bは1時間半(1:30時間)請求する必要があります

Cは1時間請求する必要があります

別の例A->B12:00 PM〜1:00PM A-> C 12:30 PM〜1:30PM

Aは1時間半(1:30時間)請求する必要があります

Bは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

これが私が考え始めたものですが、1つのクエリを呼び出しテーブルのすべての可能な入力に適合させようとすると混乱に陥ります

    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に注意)

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

アカウントで受信した通話の議事録(callrecieverに注意)

    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での4方向通話データの例

    - <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> 
4

1 に答える 1

0

ここには2つの問題があると思います。1 つ目は、セッションで各発信者に割り当てる時間を決定することです。2 つ目は、この情報を集約することです。

セッション内の特定の電話番号は常に連続していると仮定しましょう。つまり、B からの呼び出しはありません--> 12:00 から 12:15 まで (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

これから、すべてのセッションを集計できます。

セッション内の通話期間が連続していない場合、問題はより困難になります。この問題を解決する最善の方法は、データベースとデータベースで使用できる機能によって異なります。

于 2012-12-04T19:15:33.683 に答える