mysql - Multiple Union 未抓取 All (*) Data Column 时如何获取行号?

标签 mysql get numbers row union

<?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 且所有列都未被抓取的此类查询的行数。

最佳答案

从您的问题中无法判断您需要什么结果。在 SQL 术语中,行的计数行号 不同。您似乎还不了解如何使用 COUNT 和 GROUP BY。 这很重要,因为您的问题没有描述您想要什么,而试图帮助您的人必须根据您的查询进行猜测.

您的 UNION 将为 1 月和 2 月的每个匹配的 mac 和 uid 组合返回一行。

也许您想要 1 月和 2 月表中对报告有贡献的总行数?

试试这个来总结您 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 注入(inject)来闯入并破坏你的数据库。转移到使用 mysqli 准备好的语句。)

关于mysql - Multiple Union 未抓取 All (*) Data Column 时如何获取行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280193/

相关文章:

http - 为什么 HTTP 请求称为 "get"和 "post"?

c++ - Cin 读取数字并检查整数

php - PHP 和 MySQL 中的短 URL 出站链接跟踪

php - MySQL 持久连接

php - 表连接上的 UNION ALL

php - 哪个更快 : multiple queries with less results or returning all and getting php to process

Php表单发布方法不发送数据

algorithm - Restful : Using POST to execute algorithms

php - 我怎样才能平均分割一组数字

php - 在php中将数字转换为十进制