Error related to only_full_group_by when executing a query in MySql

前端 未结 18 2477
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-21 04:39

I have upgraded my system and have installed MySql 5.7.9 with php for a web application I am working on. I have a query that is dynamically created, and when run in older ve

18条回答
  •  迷失自我
    2020-11-21 05:08

    I would just add group_id to the GROUP BY.

    When SELECTing a column that is not part of the GROUP BY there could be multiple values for that column within the groups, but there will only be space for a single value in the results. So, the database usually needs to be told exactly how to make those multiple values into one value. Commonly, this is done with an aggregate function like COUNT(), SUM(), MAX() etc... I say usually because most other popular database systems insist on this. However, in MySQL prior to version 5.7 the default behaviour has been more forgiving because it will not complain and then arbitrarily choose any value! It also has an ANY_VALUE() function that could be used as another solution to this question if you really needed the same behaviour as before. This flexibility comes at a cost because it is non-deterministic, so I would not recommend it unless you have a very good reason for needing it. MySQL are now turning on the only_full_group_by setting by default for good reasons, so it's best to get used to it and make your queries comply with it.

    So why my simple answer above? I've made a couple of assumptions:

    1) the group_id is unique. Seems reasonable, it is an 'ID' after all.

    2) the group_name is also unique. This may not be such a reasonable assumption. If this is not the case and you have some duplicate group_names and you then follow my advice to add group_id to the GROUP BY, you may find that you now get more results than before because the groups with the same name will now have separate rows in the results. To me, this would be better than having these duplicate groups hidden because the database has quietly selected a value arbitrarily!

    It's also good practice to qualify all the columns with their table name or alias when there's more than one table involved...

    SELECT 
      g.group_id AS 'value', 
      g.group_name AS 'text' 
    FROM mod_users_groups g
    LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
    WHERE g.active = 1 
      AND g.department_id = 1 
      AND g.manage_work_orders = 1 
      AND g.group_name != 'root' 
      AND g.group_name != 'superuser' 
    GROUP BY 
      g.group_name, 
      g.group_id 
    HAVING COUNT(d.user_id) > 0 
    ORDER BY g.group_name
    

提交回复
热议问题