【问题标题】:"sql_mode=only_full_group_by" incompatibility error“sql_mode=only_full_group_by”不兼容错误
【发布时间】:2018-03-12 20:18:55
【问题描述】:

我的 SQL 语句在另一台本地服务器上运行良好,但在最近安装的 Lamp 服务器上试用了我的项目后,它显示以下错误-

SELECT 列表的表达式 #2 不在 GROUP BY 子句中并且包含 非聚合列“newmesssages.send_date”不是 功能上依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容

声明-

SELECT COUNT(reciever) as total, send_date, message, sender_username, sender_name 
FROM (SELECT * FROM messages_view WHERE reciever = 17 AND viewed_by_reciever is NULL order by send_date DESC) 
AS newmesssages 
GROUP BY sender ORDER BY send_date DESC LIMIT 20

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您需要按所有未聚合的列进行分组,如下所示:

    SELECT COUNT(reciever) as total, send_date, message, sender_username, sender_name 
    FROM (SELECT * 
         FROM messages_view 
         WHERE reciever = 17 AND viewed_by_reciever is NULL order by send_date DESC) 
         AS newmesssages 
    GROUP BY send_date, message, sender_username, sender_name 
    ORDER BY send_date DESC LIMIT 20
    

    如果您不想按这些列进行分组,则需要将它们从 SELECT 中删除。

    另一种解决方案是更改 sql_mode 这样做:

    SET SESSION sql_mode = REPLACE(@@sql_mode, ',only_full_group_by', '');
    

    最后,您的 SQL 中有一个错误,您按 sender 分组,但您没有该列名

    已编辑: 你可以这样做:

    SELECT (SELECT COUNT(reciever)  
            FROM (SELECT * 
                  FROM messages_view 
                  WHERE reciever = 17 AND viewed_by_reciever is NULL 
                  order by send_date DESC) AS newmesssages 
            GROUP BY send_date, message, sender_username, sender_name),
            send_date, message, sender_username, sender_name 
    FROM (SELECT * 
         FROM messages_view 
         WHERE reciever = 17 AND viewed_by_reciever is NULL order by send_date DESC) 
    ORDER BY send_date DESC LIMIT 20
    

    我认为这可行

    【讨论】:

    • 这行得通,但是,我从用户那里获得所有未读消息,而不仅仅是最后一条消息和来自该用户的未读消息总数
    • 如果你想要最后一条消息,你必须做一个不同的查询
    • SET sql_mode = ' ' 很危险,还有更多的 sql 模式需要激活。最好使用SET SESSION sql_mode = REPLACE(@@sql_mode, ',only_full_group_by', '');,这只会删除 only_full_group_by 选项并保持其他 sql 模式处于活动状态。
    【解决方案2】:

    您的查询ONLY_FULL_GROUP_BY禁用此代码

    对于 Mysql:-- 在您的查询中使用此代码:

    $set_mode = "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"; $resultss = mysqli_query($this->dbh,$set_mode);
    

    对于 codeigniter :-- 在您的查询中使用此代码:

    $this->db->query("SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));") ;
    

    至于你:

    $set_mode = "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"; $resultss = mysqli_query($this->dbh,$set_mode);
    SELECT COUNT(reciever) as total, send_date, message, sender_username, sender_name 
    FROM (SELECT * FROM messages_view WHERE reciever = 17 AND viewed_by_reciever is NULL order by send_date DESC) 
    AS newmesssages 
    GROUP BY sender ORDER BY send_date DESC LIMIT 20
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2020-02-29
      • 1970-01-01
      • 2017-05-02
      • 2016-10-03
      相关资源
      最近更新 更多