php - 通过PHP有条件地统计MYSQL列行(多个数据库)并输出数据

标签 php mysql union

我正在尝试运行查询并从同一服务器上的多个数据库(使用 UNION 子句)获取结果,但它对我不起作用。所有数据库中的表名和列名都是相同的(相同的杯子,相同的咖啡,不同的“商店”:D)。这是我的sql语句:

 $result = mysql_query("SELECT MONTH(ScanDate) AS sdmonth, YEAR(ScanDate) AS sdyear,  
              COUNT(Investigation) AS Investigation, COUNT(CASE WHEN `Gender` = 'Male' THEN 1 END) AS MaleCount, 
              COUNT(CASE WHEN `Gender` = 'Female' THEN 1 END) AS FemaleCount, SUM(InvestigationAmount) AS investigationAmount, SUM(AmountDue) AS AmountDue   
                    FROM `database1`.`table_name`
                    UNION
                    SELECT MONTH(ScanDate) AS sdmonth, YEAR(ScanDate) AS sdyear,  
              COUNT(Investigation) AS Investigation, COUNT(CASE WHEN `Gender` = 'Male' THEN 1 END) AS MaleCount, 
              COUNT(CASE WHEN `Gender` = 'Female' THEN 1 END) AS FemaleCount, SUM(InvestigationAmount) AS investigationAmount, SUM(AmountDue) AS AmountDue   
                    FROM `database2`.`table_name` 
                    WHERE (ScanDate BETWEEN '{$ScanDate1}' AND '{$ScanDate2}')
UNION
SELECT MONTH(ScanDate) AS sdmonth, YEAR(ScanDate) AS sdyear,  
              COUNT(Investigation) AS Investigation, COUNT(CASE WHEN `Gender` = 'Male' THEN 1 END) AS MaleCount, 
              COUNT(CASE WHEN `Gender` = 'Female' THEN 1 END) AS FemaleCount, SUM(InvestigationAmount) AS investigationAmount, SUM(AmountDue) AS AmountDue   
                    FROM `database3`.`table_name` 
                    WHERE (ScanDate BETWEEN '{$ScanDate1}' AND '{$ScanDate2}')");


    //-create  while loop and loop through result set
    while($row=mysql_fetch_array($result)){ 
    $month_doe=$row['sdmonth']; 
    $year_doe=$row['sdyear'];
    $si=$row['Investigation'];
    $male=$row['MaleCount'];
    $female=$row['FemaleCount'];
    $sum_investigation=number_format($si);
    $sia=$row['investigationAmount'];
    $sum_investigationamount=number_format($sia);
    $srd=$row['AmountDue'];
    $sum_rebatedue=number_format($srd);
    }

我绝对不知所措,做了很多错误的事情,因为这只输出第二个数据库的结果。有人能指出我正确的方向吗?谢谢。

如果我的连接参数也有问题,以下是我的连接详细信息:

<?php  
    $conn = mysql_connect('localhost', 'root', '');
     if (!$conn)
    {
     die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("", $conn);
?>

最佳答案

有几件事值得一看。首先,默认情况下,MySQL 中的 UNION 作为 DISTINCT 运行,丢弃它认为相等的行。

如果您想返回所有行,则需要使用 UNION ALL 而不是仅使用 UNION。

我会尝试使用 UNION ALL。

如果这仍然不起作用,那么您为所有变量提供别名的方式可能会对它们的返回方式造成严重破坏。

我会修改它以删除第二个和第三个选择语句的别名,如下所示:

"SELECT MONTH(ScanDate) AS sdmonth, YEAR(ScanDate) AS sdyear,  
          COUNT(Investigation) AS Investigation, COUNT(CASE WHEN `Gender` = 'Male' THEN 1 END) AS MaleCount, 
          COUNT(CASE WHEN `Gender` = 'Female' THEN 1 END) AS FemaleCount, SUM(InvestigationAmount) AS investigationAmount, SUM(AmountDue) AS AmountDue   
                FROM `database1`.`table_name`
                UNION ALL
                SELECT MONTH(ScanDate), YEAR(ScanDate),  
          COUNT(Investigation), COUNT(CASE WHEN `Gender` = 'Male' THEN 1 END), 
          COUNT(CASE WHEN `Gender` = 'Female' THEN 1 END), SUM(InvestigationAmount), SUM(AmountDue)   
                FROM `database2`.`table_name` 
                WHERE (ScanDate BETWEEN '{$ScanDate1}' AND '{$ScanDate2}')
UNION ALL
SELECT MONTH(ScanDate), YEAR(ScanDate),  
          COUNT(Investigation), COUNT(CASE WHEN `Gender` = 'Male' THEN 1 END), 
          COUNT(CASE WHEN `Gender` = 'Female' THEN 1 END), SUM(InvestigationAmount), SUM(AmountDue)
                FROM `database3`.`table_name` 
                WHERE (ScanDate BETWEEN '{$ScanDate1}' AND '{$ScanDate2}')"

希望有帮助

关于php - 通过PHP有条件地统计MYSQL列行(多个数据库)并输出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40588331/

相关文章:

sql - 将两个带有动态行标题的交叉表合并为一个

php - Laravel 4.2 联盟

php - 比较日期是否已过

php - 关于减少从 AJAX 快速调用 PHP 脚本的服务器开销的建议

php - 将选择框值发布到 php mysql 查询时出现问题

php - 如何解决 mysql_fetch_assoc() 问题

php - woocommerce给50000种产品一个新的类别

php - mysql_num_rows() 期望参数 1 是资源,在中给出的 bool 值

php - 缓存网页数据源

c - 字段的类型不完整 - union 和结构