Mangeur de cigogne Hébergement du site en PHP et Mysql par WDMédia-hébergement
Vous aussi adpotez les éléPHPants de Vincent Pontier !


Rechercher dans le forum

Mots-clés :

Trouver :
un de ces termes tous les termes

Depuis :
7 j 15 j 30 j


Retour à l'index du forum

distinct sur plusieurs colonnes

Message original de philippe

Le : 29/06/2008 à 13:40:31

Dejà lu 287 fois avant vous

Bonjour à tous.

Lorsqu' on fait un SELECT DISTINCT sur une colonne,
on ne peut pas extraire les données des autres colonnes
( du moins, ayant beaucoup cherché, j' ai pas trouvé ).

Il m' a donc fallu faire plusieurs SELECT à l' intérieur d' une boucle afin d' y arriver.
Ca marche.

Mais le code naïf et simpliste que j' ai pondu ne me plait qu' à moitié.

Pourriez-vous me dire si vous avez une solution plus simple et plus efficace ?

Le code fait 30 lignes, mais je ne sais pas si j' ai le droit de le coller ici,
ou bien faut-il absolument le mettre sur le Wall ?

Merci, Modérateurs, pour votre réponse.

@+
Philippe.

Re: distinct sur plusieurs colonnes

Réponse de Maljuna Kris

Le : 29/06/2008 à 16:18:15

Saluton,
La réponse est oui, il faut utiliser le wall.
L'autre réponse, dépendra de ce que tu mettras sur le wall mais, peut-être que la fonction GROUP_CONCAT, associée à un GROUP BY peut constituer une solution.

Re: distinct sur plusieurs colonnes

Réponse de philippe

Le : 29/06/2008 à 18:18:20

Salut tous.

Voici le lien vers ze brix in ze wall :
http://phpdebutant.org/wall452.php

Merci pour votre aide.
@+
Philippe.

Re: distinct sur plusieurs colonnes

Réponse de Maljuna Kris

Le : 30/06/2008 à 07:52:16

Lorsqu' on fait un SELECT DISTINCT sur une colonne,
on ne peut pas extraire les données des autres colonnes
( du moins, ayant beaucoup cherché, j' ai pas trouvé ).

A y bien réfléchir, je ne crois pas que cette phrase ait du sens.

DISTINCT opère sur l'ensemble des colonnes du SELECT. L'unicité est donc assurée sur la ligne de réponse. Il n'y aura pas deux lignes ayant l'ensemble de leurs colonnes identiques. En d'autres termes, il suffit qu'une colonne de la clause SELECT diffère pour que l'unicité ne soit pas assurée et les lignes retenues.

Du coup, j'avoue ne pas comprendre grand chose à ton usine à gaz sur le wall. Comme tu ne nous explique pas clairement et simplement où tu veux en venir, il est difficile de t'aiguiller.

Re: distinct sur plusieurs colonnes

Réponse de philippe

Le : 30/06/2008 à 11:37:48

Salut Maljuna Kris.

A la relecture je vois que tu as raison. Je vais essayer d' être plus clair.

Le fait de composer ce message m' a fait réfléchir, et j' ai tout repris depuis le début.

Nous voulons comptabiliser les visites du site jour par jour.
Si un visiteur se connecte plusieurs fois dans la journée, nous ne le comptabilisons qu' une seule fois.

Ce qu' il me semble avoir compris :

On ne peut pas faire un DISTINCT sur plusieurs colonnes, mais on Peut inclure plusieurs champs dans la requête.
Ma confusion venait du fait de ne pas avoir compris ça.

SELECT DISTINCT visiteur_nom, visiteur_prenom
est correct. La recherche se fait sur "visiteur_nom" et le champ associé "visiteur_prenom" est bien extrait.

SELECT DISTINCT visiteur_nom, visiteur_prenom, heure_visite
donne deux fois le nom s' il s' est connecté deux fois,
car les deux lignes ne sont pas identiques puisque les heures sont différentes.

Un deuxième Select est donc nécessaire pour extraire l' heure de la première visite,
avec comme critères WHERE nom = nom et prenom = prénom.

-------------

J' ai édité mon "Usine à Gaz".
Elle est ici : http://phpdebutant.org/wall462.php

Mais si je vous ai demandé de l' aide, c' est justement par ce que c' est une vrai Usine.
J' ai cherché et pondu qq chose qui marche.
Je vous demande maintenant, si vous en avez le temps,
de suggérer une autre façon de faire, plus simple et plus propre.

J' apprendrai ainsi à éliminer l' inutile.

D' avance, merci pour votre aide.
@+
Philippe.

Re: distinct sur plusieurs colonnes

Réponse de Maljuna Kris

Le : 30/06/2008 à 13:39:45

Je ne vois pas l'intérêt de refaire une requête pour récupérer l'heure de la première visite du jour.
D'autre part si tu veux juste compter les visiteurs du jour, à quoi te servent leurs noms, prénoms et heure de visite ?
Si tu veux récupérer la première visite du jour de chaque visiteur, il te suffit de faire un GROUP BY visiteur avec la fonction MIN sur l'heure et un filtre WHERE sur le jour :
SELECT visiteur_nom, visiteur_prenom, MIN(heure_visite)
FROM $tableau_visites_adherents
WHERE mois_visite = '$mois_choisi' AND jour_visite = '$i'
GROUP BY visiteur_id

Re: distinct sur plusieurs colonnes

Réponse de philippe

Le : 05/07/2008 à 17:22:20

Bonjour à tous.

Désolé, Maljuna Kris, pour ce retard de réponse.

Merci pour la piste GROUP BY visiteur et MIN sur l' heure.
Et c' est très sympa de l' avoir intégré à mon code afin que je comprenne.

Avant de m' en servir ( de le coller bêtement sur ma page ),
je suis allé chercher le pourquoi de Group by et Min.
Tu as raison : ça évite une boucle inutile.

J' ai vérifié le résultat dans un tableau croisé Excel : aucun doublon.

Et là, je ne comprenais pas pourquoi il n' y a pas de doublons lorsque tout est strictement identique sur la ligne :
heure_visite, nom / prenom, ect.
Il devrait y en avoir, si les 2 heures de visites sont identiques pour un même visiteur.

Je suppose que la raison est que mon heure de visite est en Text dans le tableau, et que


"si l' argument est de type String,
la valeur retournée est la première valeur par rapport à l' ordre alphabétique"



Si ce n' est pas ça, se serait gentil de me le dire.

Merci encore.
@+
Philippe.


PS :
Ce compteur n' est pas là pour gonfler mon ego au vu du nombre de visites.
Nous nous sommes rendus compte que nous avons un réel besoin des noms et heures.
@+ Ph.

Re: distinct sur plusieurs colonnes

Réponse de Maljuna Kris

Le : 05/07/2008 à 17:57:37

La fonction MIN retourne LA valeur la plus petite, que cette valeur existe une ou n fois dans le jeu d'enregistrements selon le critère de regroupement. Rien à voir avec le type de données sauf que MIN s'adapte en fonction de ce type '123' est plus petit que '98' alors que 98 est plus petit que 123

Re: distinct sur plusieurs colonnes

Réponse de philippe

Le : 05/07/2008 à 20:16:00

Bonsoir à vous tous.

Merci, Maljuna Kris.


La fonction MIN retourne LA valeur la plus petite, que cette valeur existe une ou n fois dans le jeu d'enregistrements . . .



J' ai beaucoup appris grâce à ton aide.
Pour moi, le sujet est bouclé.

@+
Philippe.
Retour à l'index du forum


Ajouter une réponse

Nom :

Email :

Titre :

Message :

Combien font 3 + 2 ?

Mise en forme : gras = [b]...[/b], italic = [i]...[/i], souligné = [u]...[/u], citation = [quote]...[/quote], lien = [url]liens_externe[/url] ou [url nom=texte]liens_externe[/url], code source : [code]...[/code]

Recevoir les réponses par mail :
Oui Non

Mémoriser mon nom et mon email :
Oui Non

 

Charte des forums PHPDébutant

Bienvenue à vous,

Vous voici donc prêt à poster sur les forums de PHPDébutant. Avant toute chose, merci de prendre le temps de lire les quelques lignes qui suivent.

Attention, à partir du moment ou vous postez dans les forums, vous acceptez la présente charte. Si votre message est modéré ou supprimé, vous ne pourrez pas dire que vous n'étiez pas au courant des règles !

Pourquoi une charte

Le but de cette charte est simple : que ces forums restent cordiaux et que les personnes aidant les autres ne se sentent pas lésées, insultées, critiquées. Pour que ces forums fonctionnent, il faut des personnes qui répondent aux questions. Pour que celles ci restent sur le forum, il faut les traiter avec respect, et ne pas les confondre avec des bonnes poires, esclaves, etc...

Mesures de régulation

  • Un nouveau message ne disant pas bonjour, ou insultant, dont le titre est tout en majuscules, pourra être supprimé sans justification (raisons non limitatives).
  • Prenez le temps de vérifier que la question que vous allez poser n'a pas déjà été posée, à l'aide du formulaire de recherche.
  • Prenez également le temps de vérifier que la réponse à votre question ne se trouve pas dans les tutoriaux. Nous ne pouvons pas répeter pour chaque visiteur tous les cours, il sont écrits, profitez-en (dans l'ordre tant qu'à faire) !
  • Nous ne faisons pas de scripts tout prêts. Nous aidons et vous guidons pour que vous puissiez trouver vous même la réponse, ce qui est beaucoup plus formateur.
  • Si vous comptez poster un message publicitaire, abstenez-vous. Au mieux le message sera supprimé, au pire les habitués descendront votre service en flamme.
  • Pour tout message de recrutement, précisez bien votre demande. Inutile de poster pour trouver un développeur pour faire gratuitement votre site de webmastering qui vous rapportera plein de sous. Les seuls coups de mains donnés en développement sont pour des associations ou des sujets passionnant un développeur.
  • Toute personne tenant des propos racistes ou illicites sera bannie et pourra faire l'objet de poursuites.
  • L'humour étant très présent sur ces forums, ne réagissez pas violemment à des propos qui pourraient être à prendre au second degré et avec de l'humour.
  • Attention aux trolls ! Leur multiplication peut entraîner la mort des forums, et sans forum, plus d'aide !
  • Respectez les thèmes des forums. Pensez aussi à vérifier que votre message n'a pas été déplacé si vous le croyez effacé.

Conseils

  • N'oubliez pas que les personnes à qui vous vous adressez sont des bénévoles qui donnent de leur temps pour vous. Si vous êtes méchants avec eux, il n'aideront plus et vous n'aurez plus d'aide !
  • Ne soyez pas pressé. Nous avons une vie aussi, et nous ne sommes par forcément tout le temps disponibles.
  • N'oubliez pas que les smileys sont la pour faire comprendre l'humeur dans laquelle vous rédigez un message. Il est indispensable de mettre des smileys quand vous faites de l'humour, sinon le message pourrait être mal perçu (ca serait quand même idiot de plomber l'ambiance en faisant de l'humour !).
  • Surveillez votre orthographe, nous ne vous demandons pas d'être littéraire, mais que votre message soit au moins compréhensible. Evitez à tout prix le style SMS.
  • Expliquez clairement le problème, ce n'est pas toujours facile, mais mieux vaut essayer de le faire le plus possible.
  • Ne postez pas de questions trop vagues du genre "comment faire un forum". Cela ne sert à rien, cela ne s'explique pas sur un coin de forum.
  • Mettez un titre clair, correspondant au sujet que vous allez poster. A l'aide, au secours, etc... ne sont pas d'une grande utilité pour ceux qui vont vous aider. Parfois nous passons en coup de vent, et si nous ne savons pas ce que va contenir le message, nous ne le regarderons même pas.
  • Ne mettez par [URGENT] ou autre joyeuseté du genre dans vos titres de messages. Cela irrite les gens (il y'a plus urgent dans la vie, pensez aux gens qui meurent de faim ou ayant besoin des pompiers, ça c'est urgent), et vous n'aurez pas votre réponse plus vite pour autant.
  • Si vous connaissez déjà à quel domaine votre question d'adresse (par exemple mysql, html, php, javascript), n'hésitez pas à le marquer au début de votre message, avec un [html] par exemple (notez les minuscules).
  • Ne dites pas "ça marche pas". Il y a toujours des raisons. Je vous invite à consulter le tutorial "ça marche pas" qui vous aidera à mieux expliquer votre problème.
  • Ne postez pas 36000 lignes de code. Sur le forum, le code apparaît non coloré et sans indentation, ce qui est illisible. Au dessus de 5 lignes, plus personne ne lit et vous n'aurez pas de réponse. Utilisez le wall
  • En règle générale restez courtois et clair, n'oubliez pas que la politesse fait partie de la vie courante. Il est de bon ton de dire bonjour même pour une réponse, même plusieurs fois dans la journée (ceux qui vous lisent n'ont pas forcément lu vos autres messsages)

La Fin

Avec tout ces conseils vous augmenterez les chances de réponse, leur pertinence et leur rapidité

Voilà, ça sera tout, bonne écriture :)

Fermer les règles et poster un message


www.phpdebutant.org © 2008 - L'équipe de phpDebutant - Hébergement : WDMédia-hébergement