Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL > Administration
Administration Forum d'entraide sur l'administration de MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/10/2012, 09h50   #1
thildouille
Invité régulier
 
Inscription : mai 2011
Messages : 37
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 37
Points : 6
Points : 6
Par défaut Desactiver ONLY_FULL_GROUP_BY mysql

Bonjour à tous,
je viens d'acheter un script de chat avec webcam, que j'essaye de faire fonctionner sur un serveur dédié OVh sous Release 2.
Le site fonctionne sauf une page qui est supposait afficher les membres en ligne.
Voici l'erreur:

A Database Error Occurred

Error Number: 1140

Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Code :
SELECT `performers`.`nickname`, `performers_videos`.*, count(DISTINCT(performers_videos.video_id)) AS total FROM `performers_videos` INNER JOIN `performers` ON `performers`.`id`=`performers_videos`.`performer_id` WHERE (SELECT COUNT(performer_id) FROM `banned_countries` WHERE `banned_countries`.`performer_id` = `performers_videos`.`performer_id` AND `banned_countries`.`country_code` = 'FR') = 0
Les techs du script me demandent de passer en mysql 5.5, actuellement je suis en 5.0.44. Pour le moment étant difficile de mettre à jour mysql sur la release 2 d'ovh, je me demandais s'il était plus simplement possible de désactiver le ONLY_FULL_GROUP_BY mode ?

merci d'avance
thildouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 14h11   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Quelle horreur cette requête ! Celui qui a pondu ce script devrait apprendre le SQL !

Elle est censée faire quoi cette requête ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 14h16   #3
thildouille
Invité régulier
 
Inscription : mai 2011
Messages : 37
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 37
Points : 6
Points : 6
C'est une page qui doit afficher les membres en lignes ...
thildouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 14h21   #4
Fred_34
Membre expérimenté
 
Homme Frédéric
Inscription : juin 2011
Messages : 442
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 442
Points : 576
Points : 576
Pour avoir les options actuelles :
Puis tu fais (Sans le ONLY_FULL_GROUP_BY):
Fred_34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 14h26   #5
thildouille
Invité régulier
 
Inscription : mai 2011
Messages : 37
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 37
Points : 6
Points : 6
merci pour vos réponse
j'ai décidé de réinstaller un debian tout neuf avec les paquets nécessaires.
Je mettrai mysql 5.5

Merci encore
thildouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 14h28   #6
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Je ne vois pas de condition dans la requête qui détermine si un membre est en ligne ou pas ! Ce n'est probablement pas la seule requête du script qui génère la page.

À moins que ce soit le fait qu'il figure dans la table "performers_videos" ?

D'ailleurs, on nomme de préférence les tables au singulier mais c'est un autre débat.

Apparemment, cette requête compte le nombre de vidéos de chaque performer et donne la liste de ces vidéos. Par contre, je ne comprends pas l'utilité du WHERE. D'après le nom de la table, il semble s'agir d'exclure du résultat les membres bannis ? Pourquoi limiter à la France ? Et il faudrait plutôt une condition NOT EXISTS que ce comptage en sous-requête corrélée qui va très vite plomber les ressources et augmenter le temps de réponse.

La partie qui pose problème et qui cause ce message d'erreur, c'est `performers_videos`.* dans le SELECT. Au passage, il vaut mieux éviter la guerre des étoiles !

Donc si j'ai bien compris le sens de la requête, ça devrait plutôt être ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT tmp.nickname, tmp.total,
	pv1. -- les colonne nécessaires et pas étoile !
FROM performers_videos pv1
INNER JOIN
(
	SELECT p.id, p.nickname,
		COUNT(DISTINCT pv.video_id) AS total
	FROM performers_videos pv
	INNER JOIN performers p ON p.id = pv.performer_id
	WHERE NOT EXISTS
	(
		SELECT 1
		FROM banned_countries b
		WHERE b.performer_id = pv.performer_id
			AND b.country_code = 'FR'
	)
	GROUP BY p.id, p.nickname
) tmp
	ON tmp.id = pv1.performer_id
La sous requête compte les vidéo des performers qui n'existent pas dans la table banned_countries pour la France et la requête principale récupère les autres colonnes de la table performers_videos pour ces performers.


Pour répondre à votre question initiale, c'est une bonne chose que ce paramètre soit actif car ça permet de détecter les requêtes foireuses de ce genre et qui peuvent donner des résultats faux si ce filtre n'est pas activé.

J'espère que vous n'avez pas payé trop cher votre script et que le reste n'est pas aussi pourri que cette requête !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h08.


 
 
 
 
Partenaires

Hébergement Web