2013-06-24 25 views
1
<?php 

$result = mysql_query("SELECT COUNT(`uid`), `mac`, SUM(`time`)/60 AS ConnTime, SUM(`download`)/1000000 AS TotalDown, SUM(`upload`)/1000000 AS TotalUp 
FROM `cdr_data_january` 
WHERE (`towerid` LIKE '".$btsid."') AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
GROUP BY `uid` 
UNION 
SELECT COUNT(`uid`), `mac_add`, SUM(`time`)/60 AS ConnTime, SUM(`download`)/1000000 AS TotalDown, SUM(`upload`)/1000000 AS TotalUp 
FROM `cdr_data_february` 
WHERE (`bts` LIKE '".$btsid."') AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
GROUP BY `uid`"); 

mysql_fetch_row($result); 
$numrows = mysql_num_rows($result); 

?> 

編輯這裏是格式化爲可讀性的sql。如何在使用多個聯合並且所有(*)數據列不被抓取時獲取行號?

SELECT COUNT(`uid`), 
      `mac`, 
      SUM(`time`)/60 AS ConnTime, 
      SUM(`download`)/1000000 AS TotalDown, SUM(`upload`)/1000000 AS TotalUp 
     FROM `cdr_data_january` 
    WHERE (`towerid` LIKE '".$btsid."') 
     AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
    GROUP BY `uid` 
    UNION 
    SELECT COUNT(`uid`), 
      `mac_add`, 
      SUM(`time`)/60 AS ConnTime, 
      SUM(`download`)/1000000 AS TotalDown, 
      SUM(`upload`)/1000000 AS TotalUp 
    FROM `cdr_data_february` 
    WHERE (`bts` LIKE '".$btsid."') 
     AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
GROUP BY `uid` 

上面的行沒有返回行數。

上面的代碼工作時,我用(*)抓住整個表並將其計數爲COUNT(*)。

請給我一個解決方案,使我能得到的行數這樣的查詢在使用UNION多,且所有列不抓住。

+0

*旁註:*停止使用'mysql_ *'函數,它們已被棄用。改用MySQLi或PDO。 – Raptor

+1

'select count(*)from(... union stuff here ...)'? –

+0

你想要結果集的行數? – Raptor

回答

1

從你的問題中不可能告訴你需要什麼結果。 A count的行與SQL行話中的行爲的不同。它也似乎是不明白如何使用COUNT和GROUP BY.這很重要,因爲你的問題沒有描述你想要的,而那些試圖幫助你的人必須根據你的查詢來猜測。

你的聯盟將返回一行的Mac的每個匹配組合和UID爲一月和二月。

也許你想要1月和2月表格中的行數有助於報告?

試試這個來總結一月份的數據。您可以在二月份使用類似的查詢,但我會將其留給您。

SELECT COUNT(*) AS recordcount, 
      `uid`, 
      `mac`, 
      SUM(`time`)/60 AS ConnTime, 
      SUM(`download`)/1000000 AS TotalDown, 
      SUM(`upload`)/1000000 AS TotalUp 
     FROM `cdr_data_january` 
    WHERE (`towerid` LIKE '".$btsid."') 
     AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
    GROUP BY `uid`, `mac` 

這會給你在每個不同的uid和mac組合的結果集中的一行。如果您還需要彙總計數,請改用此GROUP BY。

GROUP BY `uid`, `mac` WITH ROLLUP 

您可能會發現它有助於重構你多月的查詢,如下所示:

SELECT COUNT(*) AS recordcount, 
      `uid`, 
      `mac`, 
      SUM(`time`)/60 AS ConnTime, 
      SUM(`download`)/1000000 AS TotalDown, 
      SUM(`upload`)/1000000 AS TotalUp 
     FROM (
       SELECT * FROM `cdr_data_january` 
       WHERE (`towerid` LIKE '".$btsid."') 
        AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
      UNION ALL 
       SELECT * FROM `cdr_data_february` 
       WHERE (`towerid` LIKE '".$btsid."') 
        AND (`ldate` BETWEEN '".$date1."' AND '".$date2."') 
      ) data 
    GROUP BY `uid`, `mac` WITH ROLLUP 

這會給你只是一個行從您的一月和二月的結合每個UID/MAC組合通話詳細記錄。請注意,WHERE子句重複使您的查詢可以利用您的crd表中的索引(如果存在)。

(提意見是正確的:用這個代碼你乞討餅乾打破,並使用SQL注入破壞你的數據庫移動到使用,也許,mysqli的預處理語句)

+0

請幫助我在這一個> http://stackoverflow.com/questions/17281101/how-to-do-pagination-while-union-is-used-in-mysql>這實際上是確切的問題... – Nirjhor

相關問題