I installed the new Ubuntu and my code has got a problem with MySQL.
( ! ) Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 3065
Expression #2 of ORDER BY clause is not in SELECT list, references column 'clicshopping_test_ui.p.products_date_added' which is not in SELECT list; this is incompatible with DISTINCT
in /home/www//boutique/includes/OM/DbStatement.php on line 97s
It seems MySQL 5.7 does'nt allow a request like:
select .... distinct with order by rand(), p.products_date_added DESC
If I use this it works:
select distinct .... with order by rand(),
How to resolve this situation ?
My SQL request in PHP
$Qproduct = $OSCOM_PDO->prepare('select distinct p.products_id,
p.products_price
from :table_products p left join :table_specials s on p.products_id = s.products_id
where products_status = :products_status
and products_view = :products_view
and p.products_archive = :products_archive
order by rand(),
p.products_date_added DESC
limit :products_limit');
$Qproduct->bindInt(':products_status', 1);
$Qproduct->bindInt(':products_view', 1);
$Qproduct->bindInt(':products_archive', 0);
$Qproduct->bindInt(':products_limit',
(int)MODULE_FRONT_PAGE_NEW_PRODUCTS_MAX_DISPLAY);
If you have control of the server and you are running legacy code you can't easily change, you can adjust the SQL mode of the server and remove "only_full_group_by" either for the duration of boot, by running the query
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
or by adding sql_mode=''
to your my.cnf file.
Obviously its better to change your code if you have the possibility, but if not, this will disable that warning.
In order to fix the issue open the following file:
/etc/mysql/mysql.conf.d/mysqld.cnf
and add the following line under [mysqld] block
sql-mode=""
If you have phpMyAdmin:
1-go to the Variables tabs
2-search label "sql mode"
3-edit the content and delete the mode : "ONLY_FULL_GROUP_BY"
4-save
NB: don't forget to verify the comma separator
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
But if you restart your serveur, you may have to re run it.
[mysqld]
# RESOLVE order-by-clause-is-not-in-select-list by removing ONLY_FULL_GROUP_BY from the sql-mode list
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
With MAMP PRO
You cannot edit your my.cnf file directly. You must use the MAMP PRO interface to edit your my.cnf file. In the menu go to File > Edit Template > MySQL > my.cnf. Then add sql_mode=''
under the [mysqld]
key
This worked for me that @pvgoran suggested
SET @@sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
You can run this when you want.
To get ->distinct('some_column')
to work for me, I needed to disable ONLY_FULL_GROUP_BY
option in mysql modes.
Rather than edit the mysql config file on the filesystem, I followed the instructions at Laravel : Syntax error or access violation: 1055 Error and added this to config/database.php
:
'strict' => true,
'modes' => [
// 'ONLY_FULL_GROUP_BY', // disabled to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION'
],
In my project, the modes
property was non-existent, so I simply pasted that bad boy in there.
NOTE : Make sure you understand that wiping the modes entirely is undesirable, and basically not strict mode, so you will lose debugging warning/error messages about stuff like varchar length exceeded. The trick is to avoid
sql_mode=""
. Notice how above I am using 6 modes and explicitly omittingONLY_FULL_GROUP_BY
.
Try this:
SELECT p.products_id, p.products_price
FROM :table_products p
LEFT JOIN :table_specials s on p.products_id = s.products_id
WHERE
products_status = :products_status AND
products_view = :products_view AND
p.products_archive = :products_archive
ORDER BY rand(), p.products_date_added DESC
GROUP BY p.products_id,p.products_price
LIMIT :products_limit
The answer of rapaelec worked for me (thank's because I couldn't find the mysql.conf file !). But don't forget to go to the homepage of phpmyadmin to see the variables tab.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.