【问题标题】:pdo + sql insert select group by NOT WORKINGpdo + sql insert select group by NOT WORKING
【发布时间】:2017-12-13 18:40:13
【问题描述】:

有人可以帮我处理这个 pdo:

  • 想法:

插入“表 1”,通过从表 0 中选择获得的行

  • table1的结构:

    id_i (int Primary AI)| id_e (int)|日期(日期时间)|数字(文本)|总和(十进制 14,2)| stat (tinyint)

额外问题:如果 1000+ 行,优化 sql 请求有什么想法吗?

我的代码:

$query = " INSERT INTO table1 (id_e, date, string, sum, stat)
    SELECT id_s, NOW(), GROUP_CONCAT(id_r), SUM(bud), 0
    FROM table0 as e
    WHERE e.stat=4 AND e.datetime<='$date' GROUP BY e.id_s
    ";

    try 
    {
    $bdd = new PDO('xxxx');
    }

    catch(Exception $e)
    {
    die('Erreur: '.$e->getMessage());   
    }
    $request= $bdd->prepare($query);

    if ($bdd->execute()) {
        echo 'ok';
    }
    else {
        echo 'no';
    }

如你所知,我说“不”!但是,如果我只执行 SELECT 它就可以了!

【问题讨论】:

  • 如果您没有收到错误,请打开错误报告以进行调试(建立连接后$bdd-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  • 谢谢你,奈杰尔,你的线索帮了大忙!现在问题已解决(列名问题)!
  • 刚刚添加为答案,以便将来的读者更容易找到解决方案。
  • 这是个糟糕的主意。不要这样做
  • @Strawberry 为什么?

标签: php mysql sql-server pdo


【解决方案1】:

您能否发布您遇到的错误?

在 5.7 中,sqlmode 默认设置为

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION.

删除子句 ONLY_FULL_GROUP_BY。你可以这样删除:

 SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

请尝试一下,看看它是否适合您。

【讨论】:

  • 为什么要删除该设置?在这种情况下,group by 部分查询中不存在的值是常量(now() 和 0)。但是关闭 ONLY_FULL_GROUP_BY 将为 0 实际上是列的查询开辟道路。这将导致意想不到的结果:假设有 0 和 1 可能。你最终只会得到这 2 个中的一个。它允许残缺的查询在没有警告的情况下运行
【解决方案2】:

将缺少的列添加到分组:

INSERT INTO table1 (id_e, date, string, sum, stat)
    SELECT id_s, NOW() as tm, GROUP_CONCAT(id_r), SUM(bud), 0 AS stat
    FROM table0 as e
    WHERE e.stat=4 AND e.datetime<='$date' 
    GROUP BY e.id_s, tm, stat

【讨论】:

    【解决方案3】:

    如果您没有收到错误,请打开错误报告以进行调试

    $bdd = new PDO('xxxx');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION;
    

    这可以让您看到出现了哪些错误,但最终用户看到这些错误并不好。

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2014-11-26
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多