Aelindor
Messages postés6Date d'inscriptionsamedi 7 avril 2007StatutMembreDernière intervention 1 décembre 2007
-
1 déc. 2007 à 00:23
Aelindor
Messages postés6Date d'inscriptionsamedi 7 avril 2007StatutMembreDernière intervention 1 décembre 2007
-
1 déc. 2007 à 18:44
Bonsoir,
j'ai un problème très embêtant avec ma requête, donc voici la tête:
SELECT c.read_by, u.id_user, GROUP_CONCAT(DISTINCT u.login SEPARATOR ", ") AS read_by
FROM contact c, user u
WHERE c.id_contact =1
AND u.id_user IN ( c.read_by )
GROUP BY c.id_contact
c.read_by est du type string qui est une suite de chiffre séparé par des virgules: "1,3,4,8,(etc...)"
Mon problème est en fait que ce champ est du type string !
Car pour faire fonctionner ma requête, plus particulièrement le IN (), il faut que ce soit comme cet exemple :
SELECT c.read_by, u.id_user, GROUP_CONCAT(DISTINCT u.login SEPARATOR ", ") AS read_by
FROM contact c, user u
WHERE c.id_contact =1
AND u.id_user IN ( 1,3,4,8,(etc...) )
GROUP BY c.id_contact
Donc ma question est, comment faire pour transformer un string : "1,3,4,8" en un type non string de la forme : 1,3,4,8 (sans les guillemets particulier du string)
Un type float ou decimal ne règle pas le problème car seulement ce qu'il y a après la première virgule est gardé...
Si vous avez une idée... merci d'avance :/
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 1 déc. 2007 à 14:20
Re,
Vais essayer de comprendre ce que tu veux...
Si je comprends bien, il y a plusieurs admins sur ton site, et tu souhaites pouvoir savoir qui a lu/répondu aux messages postés dans un formulaire de contact.
Si c'est bien ça, je pense que tu ne prends pas les choses dans le bon sens. Personnellement, je ne ferais pas comme ça.
J'aurais effectivement une table pour stocker les messages, mais j'en aurais deux de plus pour savoir qui a lu/répondu.
Pour savoir qui a lu un message d'id 3 par exemple :
SELECT u.id_user, u.pseudo, cr.date_read
FROM contact_read cr
LEFT JOIN users u
ON u.id_user=cr.id_user
WHERE cr.id_contact=3
GROUP BY u.id_user;
Pour connaitre la réponse qui a été faite, même genre de requête :
SELECT u.id_user, u.pseudo, ca.date_answer, ca.text_answer
FROM contact_answered ca
LEFT JOIN users u
ON ca.id_user=u.id_user
WHERE ca.id_contact=3
GROUP BY u.id_user;
Je trouve cette manière de faire non seulement plus efficace, mais surtout plus conforme à ce qu'aurait donné une analyse du problème avec Merise.
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 1 déc. 2007 à 15:33
J'avais presque terminé mon message quand mon pc a décidé de redémarrer tout seul... pffffffff...
Je comprends ta réticence vis à vis d'un nombre important de tables, pour avoir déjà eu la même. Cependant, si le fait de vouloir limiter le nombre de tables est pertinent du point de vue de l'humain (plus facile de s'y retrouver dans son interface de gestion type phpMyAdmin), cela n'a aucun sens du point de vue de la machine.
Chercher dans un champ texte une valeur à extraire (ce qui implique des traitements de la chaine avant de pouvoir comparer) est bien plus coûteux en performances qu'une recherche sur deux tables bien indexées.
Et puis je sais plus ce que j'avais écrit d'autre... mpff :/
N'hésite pas à te renseigner sur Merise, y'a de très bons bouquin sur le sujet (chez O'Reilly et Eyrolles notamment) : c'est un outil puissant d'analyse qui n'a pas la notoriété qu'il mérite.
Aelindor
Messages postés6Date d'inscriptionsamedi 7 avril 2007StatutMembreDernière intervention 1 décembre 2007 1 déc. 2007 à 01:14
malheureusement non j'ai déjà essayé ça :/ voilà ce que ça me donne comme résultat:
read_by |, id_user |ready |----
1,3,4, , 1, Blackelf
la requête était:
SELECT c.read_by, u.id_user, GROUP_CONCAT(DISTINCT u.login SEPARATOR ", ") AS ready
FROM contact c, user u
WHERE c.id_contact =1
AND u.id_user IN ( SELECT c.read_by FROM contact c)
GROUP BY c.id_contact
alors que moi je souhaite ceci :
read_by |id_user |ready |----
1,3,4, 1, Blackelf, Pseudo2, Pseudo3
(les chiffres du champ read_by correspondent chacun à l'id d'un membre dans ma table user).
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_lowkey
Messages postés260Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 5 novembre 20101 1 déc. 2007 à 02:49
SELECT c.read_by, u.id_user, GROUP_CONCAT(DISTINCT u.login SEPARATOR ", ") AS ready
FROM contact c, user u
WHERE c.id_contact =1
AND u.id_user IN ( SELECT c.read_by FROM contact c)
GROUP BY c.id_contact
Tu fait un group by sur un champ qui n'est pas dans ton select => pas bon.
Si tu nous mettais la structure de tes tables, ce serait plus simple
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 1 déc. 2007 à 11:55
Salut,
"Tu fait un group by sur un champ qui n'est pas dans ton select => pas bon."
Pas vrai du tout. On peut tout à fait faire un group_by sur un champ caché.
Cela dit, je rejoins lowket sur le fait qu'avec la structure des tables, c'est plus facile. Et puis dis nous concrètement ce que tu cherches à faire, c'est plus facile pour comprendre et te proposer une solution que tu n'as peut-être pas envisagée.
Aelindor
Messages postés6Date d'inscriptionsamedi 7 avril 2007StatutMembreDernière intervention 1 décembre 2007 1 déc. 2007 à 12:03
Ce que je souhaite obtenir c'est d'afficher à la lecture du message dans mon administration la ligne suivante :
"Ce message a déjà été lu par Blackelf, Pseudo2, Pseudo3 (etc...), le Mercredi 17 (etc...)"
Bien sûr, je sais très bien que je pourrais faire ça en 2 requêtes et c'est fini mais pourtant je suis sûr qu'il y a moyen de le faire en une requête, j'y suis arrivé en faisant comme ça dans mysql:
SELECT c.read_by, u.id_user, GROUP_CONCAT(DISTINCT u.login SEPARATOR ", ") AS read_by
FROM contact c, user u
WHERE c.id_contact =1
AND u.id_user IN ( 1,3,4 )
GROUP BY c.id_contact
Ici le IN fonctionne parfaitement bien et me renvoie ce que je veux, mais quand je remplace par le champ c.read_by, là ça ne marche pas alors que c'est la même chose (mais de type varchar).
Aelindor
Messages postés6Date d'inscriptionsamedi 7 avril 2007StatutMembreDernière intervention 1 décembre 2007 1 déc. 2007 à 14:50
Merci de ta réponse,
en effet tu as parfaitement compris ce que j'essaye de faire.
Il est clair que ta méthode est beaucoup plus clair, seulement j'ai pris l'habitude d'avoir un nombre de table restreint pour chaque module que je créer, car là si on compte ça fait 3 tables différentes +1 externe pour réaliser ce que je veux.
Moi ça me parait beaucoup et de ce fait moins efficace, mais je dois très certainement me tromper, je ne suis pas du tout expert dans le domaine donc bon... d'ailleurs le terme Merise m'était inconnu jusqu'à maintenant, wikipédia m'a renseigné et je vais tacher d'en apprendre un peu plus...
Donc je pense que je vais faire comme tu le pense, je me disais que c'était mieux de faire une table regroupant toute les infos concernant un message et son suivi mais bon ce n'est finalement peut-être pas le cas :/
Merci de ton aide, j'attends ta réponse et je met le sujet en résolu.