Rêquete d'un débutant - SQL/NoSQL - Programmation
Marsh Posté le 26-11-2006 à 23:12:02
cf. commande SQL `GROUP BY`
Par contre, il me semble qu'il fasse spécifier les champs voulu et non un *
Marsh Posté le 26-11-2006 à 23:19:31
Je ne sais si j'ai été clair alors voilà ce que je désirerais
(j'ai remplacé l'adresse ip par un nom. C'est plus simple)
Afficher la table sans doublons classée par date
En gros,
Transformer cette table
Code :
|
en celle là en éliminant les doublons les plus vieux
Code :
|
Existe-t-il une facon simple de faire cela ?
Marsh Posté le 26-11-2006 à 23:21:34
Master p a écrit : cf. commande SQL `GROUP BY` |
oui c'est bien mon soucis. Je voudrais un *. C'est possible avec une requête imbriquée ?
Marsh Posté le 26-11-2006 à 23:32:34
joe451 a écrit : oui c'est bien mon soucis. Je voudrais un *. C'est possible avec une requête imbriquée ? |
Liste tes champs dans le SELECT, au lieu du * :
Code :
|
Mais, en fait, ça marche aussi avec un *
Marsh Posté le 26-11-2006 à 23:37:06
Master p a écrit : Liste tes champs dans le SELECT, au lieu du * :
|
euh ce serait plutot GROUP BY Nom , non ?
Mais j'ai même un problème...
Marsh Posté le 26-11-2006 à 23:41:33
joe451 a écrit : euh ce serait plutot GROUP BY Nom , non ? |
Je t'ai donné un mode d'emploi, pas la solution de ton exercice
joe451 a écrit : Existe-t-il une facon simple de faire cela ? |
Oui, et c'est très simple par le biais d'un GROUP BY
Marsh Posté le 27-11-2006 à 00:16:22
Master p a écrit : Je t'ai donné un mode d'emploi, pas la solution de ton exercice |
Ca marche pas avec
SELECT *
FROM `table`
GROUP BY `Nom`
ORDER BY `Date_de_visite` ASC
si par exemple je rajoute
id |Nom |Date_de_visite
8 |Gérard |12-01-2000 2000-01-08 00:00:00
9 |Gérard |12-01-2000 2000-01-05 00:00:00
10 |Gérard |12-01-2000 2000-01-06 00:00:00
J'aurais toujours le n°8 en réponse alors que je voudrais le 9 pour `Date_de_visite` ASC
J'ai le 8 pour `Date_de_visite` DESC mais c'est un coup de chance. C'est parce que c'est le premier si on classe par id
Marsh Posté le 27-11-2006 à 00:28:40
Pour ceux que ca interesse, voici la table
Code :
|
et voici ce que je voudrais en réponse
Code :
|
Marsh Posté le 27-11-2006 à 00:57:20
la prochaine fois, j'évite de poster sans réfléchir.
Code :
|
Fig 1. : Teh mighty GROUP BY comamnd
Marsh Posté le 27-11-2006 à 00:59:01
Pour info, cette utilisation des GROUP BY fonctionne aussi avec la commande HAVING() (peut-être moins standart, j'en sais rien )
Marsh Posté le 27-11-2006 à 01:31:59
Master p a écrit : la prochaine fois, j'évite de poster sans réfléchir.
Fig 1. : Teh mighty GROUP BY comamnd |
Si je fais cela
Code :
|
j'ai ca en réponse
Code :
|
C'est presque bon sauf que je n'ai pas les bons identifiants mais on se rapproche je le sens...
Bon je vais dormir lol
Merci de ton aide Master p
Marsh Posté le 27-11-2006 à 01:50:25
Dans ce cas là, c'est donc GROUP BY + HAVING
Il y a de la doc dispo sur le net, te gêne pas
Marsh Posté le 27-11-2006 à 18:33:28
Master p a écrit : Dans ce cas là, c'est donc GROUP BY + HAVING |
euh je ne vois pas quelle condition mettre dans le HAVING pour avoir les bons "id"...
Marsh Posté le 27-11-2006 à 21:17:54
pas top le group by pour fusionner des requêtes. Le group by s'utilise plutot avec des fonctions tel que COUNT, MAX, MIN, SUM, etc...
je pense qu'ici un UNION est bcp plus adéquat
SELECT ...
FROM ...
WHERE ...
UNION
SELECT ...
FROM ...
WHERE ...
Attention que dans la clause SELECT, il faut le même nombre de champ et que ceux ci soit de mêmes types
Marsh Posté le 27-11-2006 à 22:05:39
Bon, bah je crois que j'était trop optimiste pour le GROUP BY + HAVING (surtout que je voulais faire l'économie d'une sous-requête).
Solution Barbare : Sous-requête pour trouver le max et retrouver l'id lui appartenant dans la table `table` :
Code :
|
Mais j'aurais voulu une solution plus propre...
Désolé pour le mauvais aiguillage ...
Marsh Posté le 27-11-2006 à 22:40:33
Oh ! Ca marche ! merci Master p.
C'est vrai que j'ai un peu galéré avec le group by+having en me disant que c'était probablement parce que je débutais... Je pensais aussi y arriver par une requête simple mais là j'ai ce que veux même si la requête est un peu plus longue. Je ne savais même pas que l'on pouvait mettre ce genre de trucs dans le FROM mais c'est bon, ca fonctionne
Marsh Posté le 28-11-2006 à 19:09:17
Master p a écrit : Bon, bah je crois que j'était trop optimiste pour le GROUP BY + HAVING (surtout que je voulais faire l'économie d'une sous-requête).
|
Tu fais une sous-requête dans tous les cas ...
Il faut une requête pour récupérer l'enregistrement le plus récent, et une autre pour les détails correspondants.
SELECT a.id, a.Nom, a.Date_de_visite
FROM `table` as a
WHERE a.Date_de_visite =
(SELECT MAX(Date_de_visite) FROM `table` WHERE nom = a.Nom);
Marsh Posté le 28-11-2006 à 21:00:26
Pas forcément.
On peut s'en tirer sans, mais ça n'est pas du tout meilleur niveau perfs.
En effet, le HAVING est particulièrement lent.
C'est surtout utile pour ceux qui ont MySQL < 4.1 en somme...
|
Marsh Posté le 26-11-2006 à 20:55:02
Bonjour,
je suis débutant en base de donnée et je voulais savoir comment fussionner ces deux requêtes en MySQL
en gros j'aimerais afficher les tuples correspondant à l'adresse ip la plus récente sans doublons
Je l'ai presque en faisant
mais je voudrais lire tous les champs de ma table
Comment on fait aussi pour sélectionner toutes les colonnes de sa table sauf une ?
Message édité par joe451 le 26-11-2006 à 20:59:25