Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[MySQL] Problème de DISTINCT et de ORDER BY

4 réponses
Avatar
POLLET Christophe
Salut à vous !
J'ai un probleme avec une requeteMySQL. J'ai une table qui a la structure
suivante :
J'utilise MySQL version 4.0.15

CREATE TABLE `forums_content` (
`id` int(10) unsigned NOT NULL auto_increment,
`thread_id` int(10) unsigned NOT NULL default '0',
`user_id` int(10) unsigned NOT NULL default '0',
`text` longtext NOT NULL,
`date` timestamp(14) NOT NULL,
PRIMARY KEY (`id`),
) TYPE=MyISAM AUTO_INCREMENT=1 ;

le champs thread_id est un référence a une ligne dans une autre table. Il y
a donc plusieurs lignes avec la meme valeur pour ce champ.

exemple de contenu de cette table :
INSERT INTO `forums_content` VALUES (1, 1, 1, '1er message 1er thread',
20040720170656);
INSERT INTO `forums_content` VALUES (2, 2, 1, '1er message 2eme thread',
20040720170713);
INSERT INTO `forums_content` VALUES (3, 2, 1, '2eme message 2eme thread',
20040720170728);
INSERT INTO `forums_content` VALUES (4, 1, 1, '2eme message 1er thread',
20040720170744);
INSERT INTO `forums_content` VALUES (5, 2, 1, '3eme message 2eme thread',
20040720171014);
les dates vont donc du plus petit au plus grand.

Ce que je veux, c'est prendre les valeurs distinctes de thread_id, dans
l'ordre desc. J'ai essaye cette requete : "SELECT DISTINCT `thread_id` FROM
`forums_content` ORDER BY `date` DESC;", mais le problème, c'est qu'elle
renvoie les deux premières lignes de la table, soit l'id 1 et 2, triées en
desc.

En fait, elle sélectionne dans l'ordre de la table les lignes ou le champs
thread_id est distinct et APRES elle les ordonnes.
Ce que je veux c'est au contraire qu'elle ordonne EN PREMIER puis
sélectionne les champs thread_id distincts.

Voila.

Merci d'avance !
Christophe

4 réponses

Avatar
Ph. B.
POLLET Christophe wrote:

Salut à vous !
J'ai un probleme avec une requeteMySQL. J'ai une table qui a la structure
suivante :
J'utilise MySQL version 4.0.15

CREATE TABLE `forums_content` (
`id` int(10) unsigned NOT NULL auto_increment,
`thread_id` int(10) unsigned NOT NULL default '0',
`user_id` int(10) unsigned NOT NULL default '0',
`text` longtext NOT NULL,
`date` timestamp(14) NOT NULL,
PRIMARY KEY (`id`),
) TYPE=MyISAM AUTO_INCREMENT=1 ;

le champs thread_id est un référence a une ligne dans une autre table. Il y
a donc plusieurs lignes avec la meme valeur pour ce champ.

exemple de contenu de cette table :
INSERT INTO `forums_content` VALUES (1, 1, 1, '1er message 1er thread',
20040720170656);
INSERT INTO `forums_content` VALUES (2, 2, 1, '1er message 2eme thread',
20040720170713);
INSERT INTO `forums_content` VALUES (3, 2, 1, '2eme message 2eme thread',
20040720170728);
INSERT INTO `forums_content` VALUES (4, 1, 1, '2eme message 1er thread',
20040720170744);
INSERT INTO `forums_content` VALUES (5, 2, 1, '3eme message 2eme thread',
20040720171014);
les dates vont donc du plus petit au plus grand.

Ce que je veux, c'est prendre les valeurs distinctes de thread_id, dans
l'ordre desc. J'ai essaye cette requete : "SELECT DISTINCT `thread_id` FROM
`forums_content` ORDER BY `date` DESC;", mais le problème, c'est qu'elle
renvoie les deux premières lignes de la table, soit l'id 1 et 2, triées en
desc.

En fait, elle sélectionne dans l'ordre de la table les lignes ou le champs
thread_id est distinct et APRES elle les ordonnes.
Ce que je veux c'est au contraire qu'elle ordonne EN PREMIER puis
sélectionne les champs thread_id distincts.

Voila.

Merci d'avance !
Christophe



Salut,

Bien pour le jeu d'essai, par contre la question relative à ce que tu veux
obtenir est incompréhensible... :-(

--
Philippe.
Avatar
POLLET Christophe

Salut,

Bien pour le jeu d'essai, par contre la question relative à ce que tu veux
obtenir est incompréhensible... :-(

--
Philippe.



Mouais c'est difficile à expliquer, mais laissez tomber, j'ai décidé de
faire autrement...

Pour ceux qui veulent comprendre ma question quand même, je reprends vite
fait...

avec la requete "SELECT DISTINCT `thread_id` FROM
`forums_content` ORDER BY `date` DESC;", MySQL commence sa lecture de la
table au début :

En premier, il y a la ligne portant l'id 1. pour le moment, `thread_id` de
cette ligne est unique, MySQL le sort.
Ensuite, MySQL passe à l'enregistrement 2. Son `thread_id` est aussi unique,
MySQL le sort.
Puis, MySQL passe à l'enregistrement 3. Son `thread_id` (c'est 2) est déjà
présent dans la sortie, il passe à l'enregistrement suivant
Etc jusqu'à la fin.
Là, MySQL ordonne la sortie, pour donner les `id` suicants (ils ne sortent
pas, car je ne sélectionne que les `thread_id`, mais ce sont les `id` lur
correspondant):
2,1

Or, ce ne sont pas les derniers (les plus récets de la table), mais les plus
anciens, triés du plus récent au plis ancien. Ce que je voulais faire était
: prendre les plus récents et les trier du plus récent au plus ancier, ce
qui aurait du donner au niveau des `id` :
5,4

Voila. Si vous n'avez toujours pas compris, ce n'est pas grave, comme je
l'ai dit, j'ai chagé de méthode...

Cordialement,
Christophe
Avatar
Ph. B.
POLLET Christophe wrote:

Salut,

Bien pour le jeu d'essai, par contre la question relative à ce que tu veux
obtenir est incompréhensible... :-(

--
Philippe.




Mouais c'est difficile à expliquer, mais laissez tomber, j'ai décidé de
faire autrement...

Pour ceux qui veulent comprendre ma question quand même, je reprends vite
fait...

avec la requete "SELECT DISTINCT `thread_id` FROM
`forums_content` ORDER BY `date` DESC;", MySQL commence sa lecture de la
table au début :

En premier, il y a la ligne portant l'id 1. pour le moment, `thread_id` de
cette ligne est unique, MySQL le sort.
Ensuite, MySQL passe à l'enregistrement 2. Son `thread_id` est aussi unique,
MySQL le sort.
Puis, MySQL passe à l'enregistrement 3. Son `thread_id` (c'est 2) est déjà
présent dans la sortie, il passe à l'enregistrement suivant
Etc jusqu'à la fin.
Là, MySQL ordonne la sortie, pour donner les `id` suicants (ils ne sortent
pas, car je ne sélectionne que les `thread_id`, mais ce sont les `id` lur
correspondant):
2,1

Or, ce ne sont pas les derniers (les plus récets de la table), mais les plus
anciens, triés du plus récent au plis ancien. Ce que je voulais faire était
: prendre les plus récents et les trier du plus récent au plus ancier, ce
qui aurait du donner au niveau des `id` :
5,4

Voila. Si vous n'avez toujours pas compris, ce n'est pas grave, comme je
l'ai dit, j'ai chagé de méthode...

Cordialement,
Christophe



Compte tenu de la description de ta table, que le champ Id est autoincrémenté,
en supposant que le couple thread_id, user_id est unique, on peut écrire:

SELECT MAX(ID)
FROM forums_content
GROUP BY thread_id, user_id

--
Philippe.
Avatar
POLLET Christophe
Compte tenu de la description de ta table, que le champ Id est


autoincrémenté,
en supposant que le couple thread_id, user_id est unique, on peut écrire:

SELECT MAX(ID)
FROM forums_content
GROUP BY thread_id, user_id



Hum... Pas bête du tout ça !
Mais tu as supposé quelque chose qui n'est pas vrai : le couple thread_id /
user_id n'est pas unique.

Peut-on simplement écrire:
SELECT MAX(ID)
FROM forums_content
GROUP BY thread_id