【问题标题】:Create MySQL temporary table and select from it within PHP创建 MySQL 临时表并在 PHP 中从中选择
【发布时间】:2015-06-07 09:41:46
【问题描述】:

我需要关于我正在编写的 PHP/MySQL 代码的建议。我需要做的是创建一个临时表,然后从中选择。问题是临时表只在创建它的查询期间持续存在,所以 PHP 中的第二个查询是空的。

这是两个查询,我认为解决方案是将它们合并到一个查询中,但到目前为止,我厌倦了没有任何工作。

如果一个接一个地执行,下面的查询在 phpMyAdmin 中有效。

临时表查询:

$sql_temp_table = "CREATE TEMPORARY TABLE IF NOT EXISTS 
                   tbl_temp (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) AS 
                  (SELECT 
                        SUM(number_active_ads) as active_ads, 
                        MONTH(create_date) as month, 
                        YEAR(create_date) as year, 
                        dealer_id as dealer_id 
                  FROM tbl_active_ads
                  WHERE dealer_id = '".$rs->fields['id']."' 
                  GROUP BY year, month 
                  ORDER BY id)";
$rs_temp_table  =   $db -> Execute($sql_temp_table);

第二个SELECT查询:

$qry_chk_active_ads = "SELECT 
                            a.*, 
                            t.user_dealer_id, 
                            t.dealer_payment_for_month, 
                            t.dealer_payment_for_year
                       FROM tbl_temp as a
                       LEFT OUTER JOIN tbl_transaction as t
                       ON (a.dealer_id = t.user_dealer_id 
                           AND a.month = t.dealer_payment_for_month 
                           AND a.year = t.dealer_payment_for_year) 
                       ORDER BY id DESC 
                       LIMIT 3";
$rs_chk_active_ads  =   $db -> Execute($qry_chk_active_ads);

更新: 当我这样做时:var_dump($rs_temp_table); 我从 PHP 得到以下输出:

object(ADORecordSet_empty)#6 (6) { ["dataProvider"]=> string(5) "empty" ["databaseType"]=> bool(false) ["EOF"]=> bool(true) [ "_numOfRows"]=> int(0) ["fields"]=> bool(false) ["connection"]=> bool(false) }

也许这可以解释为什么 PHP 中的 temp_table 似乎是空的?

【问题讨论】:

  • 临时表会持续到连接关闭。如果您或您的数据库类在每次查询后关闭连接,您的临时表将丢失。
  • @Hobo Sapiens,我没有关闭连接,数据库类也绝对没有这样做。如果你说的是正确的,为什么第二个查询在 PHP 中是空的,但在 phpMyAdmin 中执行成功?
  • 如果您可以在 PHPMyAdmin 中成功运行这些查询,那么您应该可以在您自己的 PHP 代码中运行它们。如果你不能,这表明你的 PHP 有问题,但你还没有发布,所以我们无法帮助你。
  • 嗯,PHP 中的代码几乎就是这两个查询。我在他们之后做的是:var_dump($rs_chk_active_ads->fields['active_ads']);`它是NULL,而在phpMYAdmin中,值是存在的。
  • 同时执行查询是否有效?所以: $db->Execute($sql_temp_table . ';' . $qry_chk_active_ads);

标签: php mysql select temp-tables


【解决方案1】:

为什么不简单地使用...

SELECT a.*
     , t.user_dealer_id
     , t.dealer_payment_for_month
     , t.dealer_payment_for_year
  FROM 
     ( SELECT SUM(number_active_ads) active_ads
            , DATE_FORMAT(create_date,'%Y-%m') yearmonth
            , dealer_id 
         FROM tbl_active_ads
        WHERE dealer_id = '".$rs->fields['id']."' 
        GROUP 
           BY DATE_FORMAT(create_date,'%Y-%m') 
     ) a
  LEFT 
  JOIN tbl_transaction t
    ON a.dealer_id = t.user_dealer_id 
   AND a.yearmonth = MONTH(t.dealer_payment_for_month)
   AND a.yearmonth = YEAR(t.dealer_payment_for_year) 
 ORDER 
    BY id DESC 
 LIMIT 3;

【讨论】:

  • 谢谢你,草莓!这就是我试图实现的替代方案。我稍微修改了您的代码以输出所需的结果,现在一切正常。似乎 ADOdb 和我试图创建的临时表存在一些问题,不知道为什么,尤其是当类似代码在类似页面上工作时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多