Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/02/2017, à 19:52

gboul

Mysql - doublon et tri

Bonjour à tous,
Je pense que certains vont dire que c'est un sujet redondant, mais je n'ai pas réussi à trouver mon bonheur sur les différents Forums, par conséquent, je m'adresse à vous.

J'ai des photos et je les ai classées par catégories (Mariages, Anniversaire...), lieu (Maison, église, salle des fêts...). Je souhaite faire une recherche MySQL par l'intermédiaire de Php, mais en évitant les doublons et en triant par id.

Je m'explique, précédemment, j'avais un serveur en php5 et j'avais une commande comme celle-ci:

 SELECT DISTINCT id, categories, lieu FROM db_photos ORDER BY id DESC LIMIT 0, 10

De cette façon, je pouvais indiquer quelles étaient les dernières catégories mise à jour en fonction du lieu.

Or depuis que je suis passé en Php7.0, cela ne fonctionne plus. J'ai l'impression qu'il enlèves les doublons sur les trois paramètres et comme id est différent pour chaque entrée, les dernières entrées ont la même catégorie et le même lieu.
A priori, cela doit venir de MySQL, mais je n'ai pas le numéro de version utilisé sur mon ancien serveur.

J'aurais aimé savoir si quelqu'un savait comment trier par id décroissant en enlevant les doublons.

Merci beaucoup de votre aide et votre temps.

Hors ligne

#2 Le 12/02/2017, à 22:42

Rufus T. Firefly

Re : Mysql - doublon et tri

Salut,

Distinct concerne les lignes sélectionnées. Et si id est un truc genre primary (donc tous distincts), ta requête va forcément sélectionner toutes les lignes, puisqu'elles sont toutes distinctes, au moins sur id.
Soit il faut enlever id dans la sélection, ce qui ne t'empêche pas de trier sur id, ou alors il faut trouver une ruse (mais ça doit être un classique du genre). Peut-être un truc comme ça : https://dev.mysql.com/doc/refman/5.5/en … eries.html


La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme

Hors ligne

#3 Le 13/02/2017, à 20:37

gboul

Re : Mysql - doublon et tri

Rufus T. Firefly a écrit :

Salut,

Distinct concerne les lignes sélectionnées. Et si id est un truc genre primary (donc tous distincts), ta requête va forcément sélectionner toutes les lignes, puisqu'elles sont toutes distinctes, au moins sur id.
Soit il faut enlever id dans la sélection, ce qui ne t'empêche pas de trier sur id, ou alors il faut trouver une ruse (mais ça doit être un classique du genre). Peut-être un truc comme ça : https://dev.mysql.com/doc/refman/5.5/en … eries.html

Bonjour Rufus,
Merci pour ton aide. Effectivement, tous mes id sont différents et incrémentés automatiquement. En fait, je m'étais aussi dit qu'en enlevant id, ça devait fonctionner, mais il n'en est rien. Si j'enlève id de la sélection, il n'est plus possible de trier par id. J'avais déjà vu le lien que tu m'as envoyé, par contre, ça m'a l'air d'un peu une usine à gaz. Je me demandais s'il n'y avait pas une solution plus simple.

Merci.

Hors ligne

#4 Le 13/02/2017, à 20:52

Rufus T. Firefly

Re : Mysql - doublon et tri

Etrange ! Je viens d'essayer, ça fonctionne, le tri sur id sans que id soit sélectionné.
As-tu essayé la requête directement dans mysql ?

mysql -u gboul -p
use ta_base_de_données;
SELECT DISTINCT categories, lieu FROM db_photos ORDER BY id DESC;
quit;

Dernière modification par Rufus T. Firefly (Le 13/02/2017, à 20:58)


La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme

Hors ligne

#5 Le 13/02/2017, à 21:26

gboul

Re : Mysql - doublon et tri

Rufus T. Firefly a écrit :

Etrange ! Je viens d'essayer, ça fonctionne, le tri sur id sans que id soit sélectionné.
As-tu essayé la requête directement dans mysql ?

mysql -u gboul -p
use ta_base_de_données;
SELECT DISTINCT categories, lieu FROM db_photos ORDER BY id DESC;
quit;

Voici le résultat:

SELECT categories, lieu FROM db_photos ORDER BY id DESC;

Ceci fonctionne très bien, mais j'ai tous les entrées de la table, puisque je n'ai pas le DISTINCT

SELECT categories, lieu FROM db_photos ORDER BY id DESC LIMIT 0, 10;

Ceci fonctionne aussi très bien et je n'ai que les 10 dernières entrées.

SELECT DISTINCT categories, lieu FROM db_photos ORDER BY id DESC LIMIT 0, 10;

Ceci par contre ne fonctionne pas. Il semblerait que le DISTINCT pose problème. Il doit probablement y avoir une faute de frappe, mais je n'arrive pas à la trouver.

Dernière modification par gboul (Le 13/02/2017, à 21:46)

Hors ligne

#6 Le 13/02/2017, à 21:53

Rufus T. Firefly

Re : Mysql - doublon et tri

J'ai copié/collé ta dernière requête, en changeant évidemment le nom des champs et celui de la table. Ça fonctionne très bien... Y compris le distinct (521 lignes alors que ma table en comporte 535, dont effectivement quelques doublons) et le tri sur l'id. Il doit y avoir un autre problème. Mais là je sèche !


La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme

Hors ligne

#7 Le 02/07/2017, à 07:27

gboul

Re : Mysql - doublon et tri

Bonjour,
Je me permets de relancer le sujet ,pour savoir si quelqu'un avait une idée pour utiliser une recherche en supprimant les doublons et en faisant un tri sur l'id qui est différent pour chaque ligne.

Merci beaucoup de votre aide à tous.

Hors ligne

#8 Le 02/07/2017, à 08:19

grigouille

Re : Mysql - doublon et tri

Au lieu de trier sur l'id, tu devrais trier sur une date.
Imagine que tu mettes des photos 2017, puis un autre jour tu t'aperçois que tu as (ou quelqu'un t'apporte) des photos 2016.
Ton id ne reflète pas une date, c'est juste un champ technique.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#9 Le 02/07/2017, à 14:09

gboul

Re : Mysql - doublon et tri

grigouille a écrit :

Au lieu de trier sur l'id, tu devrais trier sur une date.
Imagine que tu mettes des photos 2017, puis un autre jour tu t'aperçois que tu as (ou quelqu'un t'apporte) des photos 2016.
Ton id ne reflète pas une date, c'est juste un champ technique.

Merci Gruigouille pour ta réponse,
En fait, j'y avait déjà pensé, mais il m'arrive d'uploader des photos sur plusieurs jours et de ce fait, je me retrouve avec des doublons, ce que je voudrais éviter.

Dernière modification par gboul (Le 02/07/2017, à 16:21)

Hors ligne

#10 Le 02/07/2017, à 19:36

gboul

Re : Mysql - doublon et tri

J'ai tenté une autre approche, mais sans succès.

J'ai décidé de faire une sous-requête comm suit:

SELECT DISTINCT categories, lieu FROM db_photos WHERE EXISTS (SELECT id FROM db_photos ORDER BY id DESC) LIMIT 0, 10

Le résultat est bien classé en supprimant les doublons, mais au lieu de récupérer les 10 dernières entrées de la liste, je récupère le 10 premières. J'ai testé avec ASC à la place de DESC, mais rien n'y fait, il semblerait que ça ne tienne pas compte du tri.

J'ai donc essayé autre chose en inversant les les deux requêtes comme suit:

SELECT id FROM db_photos WHERE EXISTS (SELECT DISTINCT categories, lieu FROM db_photos) ORDER BY id DESC LIMIT 0, 10

Cette fois-ci, j'obtiens bien les 10 dernières entrées, par contre, j'ai des doublons.

Quelqu'un aurait-il une autre idée, s'il vous plaît?

Merci.

Hors ligne

#11 Le 02/07/2017, à 20:02

grigouille

Re : Mysql - doublon et tri

gboul a écrit :
SELECT DISTINCT categories, lieu FROM db_photos WHERE EXISTS (SELECT id FROM db_photos ORDER BY id DESC) LIMIT 0, 10

À quoi sert cet order by ?


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#12 Le 02/07/2017, à 20:03

grigouille

Re : Mysql - doublon et tri

gboul a écrit :
SELECT id FROM db_photos WHERE EXISTS (SELECT DISTINCT categories, lieu FROM db_photos) ORDER BY id DESC LIMIT 0, 10

À quoi sert ce distinct ?


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#13 Le 02/07/2017, à 20:21

gboul

Re : Mysql - doublon et tri

grigouille a écrit :
gboul a écrit :
SELECT DISTINCT categories, lieu FROM db_photos WHERE EXISTS (SELECT id FROM db_photos ORDER BY id DESC) LIMIT 0, 10

À quoi sert cet order by ?

Ce ORDER BY sert à trier de façon décroissante les résultats en triant le paramètre ID.

grigouille a écrit :
gboul a écrit :
SELECT id FROM db_photos WHERE EXISTS (SELECT DISTINCT categories, lieu FROM db_photos) ORDER BY id DESC LIMIT 0, 10

À quoi sert ce distinct ?

Le DISTINCT sert à enlever les doublons qui sont dans les colonnes CATEGORIES et LIEU

Hors ligne

#14 Le 02/07/2017, à 20:39

grigouille

Re : Mysql - doublon et tri

Je ne comprends toujours pas ce que vient faire un 'distinct' et un 'order by' dans un exits.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#15 Le 02/07/2017, à 20:45

gboul

Re : Mysql - doublon et tri

grigouille a écrit :

Je ne comprends toujours pas ce que vient faire un 'distinct' et un 'order by' dans un exits.

Comme je l'ai marqué, c'était un essai. Je ne suis pas un Pro de MySQL, de ce fait, je fais des essais. ;-)

Hors ligne

#16 Le 02/07/2017, à 20:56

grigouille

Re : Mysql - doublon et tri

OK pour les essais. Par contre, cela n'a rien à voir avec MySQL. C'est du SQL tout court.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#17 Le 03/07/2017, à 19:49

gboul

Re : Mysql - doublon et tri

grigouille a écrit :

OK pour les essais. Par contre, cela n'a rien à voir avec MySQL. C'est du SQL tout court.

Oui, c'est vrai, pardon pour l'erreur.

Hors ligne

#18 Le 04/07/2017, à 08:27

bruno

Re : Mysql - doublon et tri

Je n'ai pas de table pour tester mais quelque chose dans le style :

SELECT * FROM db_photos WHERE id IN (SELECT MAX(id) FROM db_photos GROUP BY categories, lieu) ORDER BY id DESC LIMIT 0, 10

En ligne

#19 Le 15/07/2017, à 13:10

gboul

Re : Mysql - doublon et tri

bruno a écrit :

Je n'ai pas de table pour tester mais quelque chose dans le style :

SELECT * FROM db_photos WHERE id IN (SELECT MAX(id) FROM db_photos GROUP BY categories, lieu) ORDER BY id DESC LIMIT 0, 10

Merci bruno pour ta réponse. J'ai tenté, mais aucun résultat ne sort. Ton idée est bonne et je vais poursuivre dans cette voie.

Merci encore

Hors ligne