<?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/