【问题标题】:Why are my JOINs failing?为什么我的 JOIN 失败了?
【发布时间】:2011-08-11 20:35:38
【问题描述】:

我有一个函数可以检索代表商店在特定日期的销售报告的单行数据。我正在使用类似的方法来检索同一类和应用程序中的数据,并且从未遇到过这个问题。我的函数(和 fetch())返回 false,而 execute() 返回 true。

当我从 SQL 编辑器在 TOAD 中运行相同的查询时,我按预期返回了一行数据。

为什么 fetch() 失败了?注意:我还尝试了 fetchAll() ,它返回一个空集。我也试过不使用绑定参数,但这也不起作用。

代码如下:

    public function getFullReport($store_id, $date)
    {
        $pdo = $this->application->database()->PDO();
        $user_id = $this->application->session()->user_id();

        $query = <<<SQL
SELECT sales_reports.*,
       labor2.hours AS labor_am,
       labor3.hours AS labor_wa,
       labor4.hours AS labor_associate,
       labor5.hours AS labor_kitchen,
       labor6.hours AS labor_training
  FROM sales_reports
       JOIN labor_reports AS labor2
          ON     sales_reports.store_id = labor2.store_id
             AND sales_reports.date = labor2.date
             AND labor2.labor_type_id = 2
       JOIN labor_reports AS labor3
          ON     sales_reports.store_id = labor3.store_id
             AND sales_reports.date = labor3.date
             AND labor3.labor_type_id = 3
       JOIN labor_reports AS labor4
          ON     sales_reports.store_id = labor4.store_id
             AND sales_reports.date = labor4.date
             AND labor4.labor_type_id = 4
       JOIN labor_reports AS labor5
          ON     sales_reports.store_id = labor5.store_id
             AND sales_reports.date = labor5.date
             AND labor5.labor_type_id = 5
       JOIN labor_reports AS labor6
          ON     sales_reports.store_id = labor6.store_id
             AND sales_reports.date = labor6.date
             AND labor6.labor_type_id = 6
       JOIN user_store_permissions
          ON sales_reports.store_id = user_store_permissions.store_id
 WHERE     sales_reports.store_id = :store_id
       AND sales_reports.date = :date
       AND user_store_permissions.user_id = :user_id
 LIMIT 1
SQL;

        $statement = $pdo->prepare($query);
        $statement->bindParam(':store_id', $store_id);
        $statement->bindParam(':date', $date);
        $statement->bindParam(':user_id', $user_id);

        $statement->execute();

        return $statement->fetch(PDO::FETCH_ASSOC);
    }

更新

劳动力 JOIN 似乎由于某种原因失败了。当我使用 LEFT JOIN 时,它返回一行 - 所有劳动力值都为空。但是,我在 Toad for MySQL 中没有看到此结果,它正确执行查询的 LEFT JOIN 和 JOIN 版本并返回整行。

所以新的问题是,为什么我的 JOIN 在我的 PHP PDO 代码中不起作用,但它们在 Toad 中运行 SQL 时使用相同的参数处理相同的数据?

【问题讨论】:

  • 乍一看……你的$date值是什么样的?它是否正确格式化为 mysql yyyy-mm-dd 字符串?还是 PHP 时间戳?
  • 已解决 我愚蠢地在我的生产服务器上而不是在我的开发服务器上运行我的 Toad 查询。生产服务器有更多数据。所以,原始问题的答案是我应该使用 LEFT JOIN 而不是 JOIN。
  • PEBKAC 再次出击...有人应该采取措施消除该问题中的中间人...
  • Kyle,如果你已经解决了这个问题,我相信你应该自己回答这个问题并选择它作为答案(因为它让人们一眼就知道问题已经解决了)恭喜你自己解决了问题,而不仅仅是在此处发布后放弃。 =]

标签: php mysql pdo fetch


【解决方案1】:

看起来它可能与限制语句有关。我在使用 PDO 时遇到了同样的问题,连接非常简单,如下所示。

select e.id,e.name,c.id2 
from espempdata e, espempclasses c 
where e.empClass=c.id2 limit 50

limit 语句失败,没有它就通过。从命令行运行它通过。很奇怪。

【讨论】:

    【解决方案2】:

    抱歉 - 我很久以前就解决了这个问题,忘记按照 Relequestual 的建议回答我自己的问题。

    我认为问题在于我在远程 MySQL 服务器上运行 Toad SQL 查询,而 PHP PDO 语句在本地 MySQL 服务器上运行。当您盯着屏幕太久时,这是一个典型的愚蠢的头脑风暴!

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      相关资源
      最近更新 更多