Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1244 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requete sql un peu spéciale

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requete sql un peu spéciale

n°1333105
Syl_83
Already in the legend...
Posté le 27-03-2006 à 20:45:39  profilanswer
 

Enfin spéciale...en fait un truc classique mais qui me pose de gros problèmes depuis plusieures heures [:blackman]
 
 
Alors je souhaiterai afficher, dans une fênetre prévue à cet effet, 10 messages qui sont parvenus à une personne en mp.
 
 
Je ne souhaite pas les 10 derniers messages mais le dernier message des 10 dernières personnes :D
 
 
Donc une ligne = un utilisateur ainsi que son dernier message, et ceci sur 10 lignes :jap:
 
 
Dans ma table nommée "pager" j'ai un champ "id" (incrémentation auto), un champ "from" (celui qui envoie le message), un champ "to" (le receveur), un champ date (unix) et un champ message bien sur.
 
 
J'ai tenté pas mal de choses mais le seul truc que j'ai réussi à sortir c'est cette requète :
 

Code :
  1. SELECT * FROM `pager` WHERE `to`=0001 GROUP BY `from` ORDER BY `date` DESC LIMIT 10


 
 
(0001 = moi, lorsque je teste sur phpmyadmin)
 
 
Qui me donne bien 10 personnes séparées, mais qui me fourni le...premier message qu'ils m'ont adressé [:alina95]
 
 
Et impossible de sortir le DERNIER message écrit par chaque utilisateur, hormis avec cette requète :
 

Code :
  1. SELECT * FROM `pager` WHERE `to`=0001 ORDER BY `date` DESC LIMIT 10


 
 
Mais qui me donne TOUT les messages de TOUS les utilisateurs. Un mec m'écrit 5 fois un mp, c'est lui qui va sortir 5 fois, donc pas un bon système.
 
 
Si quelqu'un a une idée j'suis preneur, j'ai testé les max(id), les DISTINCT et un peu tout sans succès, surement du à ma totale inexpérience [:markdavis]


Message édité par Syl_83 le 27-03-2006 à 20:53:32

---------------
Michael Schumacher laissera une trace immense dans l'histoire de notre sport. Il en a aussi laissé une belle sur les flancs de ma Williams à Adélaïde, en 1994...
mood
Publicité
Posté le 27-03-2006 à 20:45:39  profilanswer
 

n°1333209
olivthill
Posté le 27-03-2006 à 22:37:41  profilanswer
 

Sauf erreur, la restriction "LIMIT 10" s'applique aux résultats de la requête d'une manière gloable, et ne s'applique pas aux résultats de sous-requêtes. Donc, il ne semble pas que cela soit faisable.
 
Une solution consisterait à diviser cette requête en plusieurs requêtes, une pour chacune des dix dernières personnes.

n°1333305
jeoff
Posté le 28-03-2006 à 09:29:53  profilanswer
 

Tu aurais un script création table + insertion de quelques lignes pour qu'on puisse tester ?
 
J'aime ce genre de problème à résoudre :)

n°1333323
dlaumor
Posté le 28-03-2006 à 10:06:24  profilanswer
 

Faut passer par une sous requete

 

Ta première requete te renvoie la date max du message pour chaque utilisateur. La deuxieme les messages qui correspondent, puis tu fais limit 10 et OK

 


Un truc dans le genre si je dis pas de conneries à adapter en fonction du SGBD (non testé)

 


SELECT * FROM pager a
WHERE to='0001' and exists
    (select max(date), user from pager b
     where a.user = b.user and a.date = b.date
     GROUP BY USER)
ORDER BY date DESC LIMIT 10


Message édité par dlaumor le 28-03-2006 à 10:09:34
n°1333381
Syl_83
Already in the legend...
Posté le 28-03-2006 à 11:04:54  profilanswer
 

jeoff a écrit :

Tu aurais un script création table + insertion de quelques lignes pour qu'on puisse tester ?
 
J'aime ce genre de problème à résoudre :)


 
 
Bon courage alors [:blackman]
 
 
Ce truc m'a retourné la tête mais d'une force [:petrus75] ...
 
 
Dis moi si ça conviens pour créer une table (oui y'a trois semaines j'avais jamais entendu parler de sql ou de php, c'est encore tout nouveau pour moi :D ) :
 
 

Code :
  1. CREATE TABLE `pager` (
  2.   `id` int(11) NOT NULL auto_increment,
  3.   `from` varchar(100) NOT NULL default '',
  4.   `to` varchar(100) NOT NULL default '',
  5.   `date` varchar(100) NOT NULL default '',
  6.   `message` varchar(100) NOT NULL default '',
  7.   UNIQUE KEY `id` (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=719 ;
  9. INSERT INTO `pager` VALUES (671, '0003', '0002', '1141764621', 'test');
  10. INSERT INTO `pager` VALUES (672, '0001', '0002', '1142083604', 'T''es en ligne ?');
  11. INSERT INTO `pager` VALUES (673, '0001', '0001', '1142093707', 'Veuillez Choisir');
  12. INSERT INTO `pager` VALUES (674, '0001', '0001', '1142183178', 'On fait connaissance ?');
  13. INSERT INTO `pager` VALUES (675, '0001', '0001', '1142183352', 'On fait connaissance ?');
  14. INSERT INTO `pager` VALUES (676, '0001', '0001', '1142183379', 'On fait connaissance ?');
  15. INSERT INTO `pager` VALUES (677, '0001', '0001', '1142184019', 'Merci bien :)');
  16. INSERT INTO `pager` VALUES (678, '0001', '0001', '1142184108', 'T''es en ligne ?');
  17. INSERT INTO `pager` VALUES (679, '0002', '0001', '1142184362', 'On fait connaissance ?');
  18. INSERT INTO `pager` VALUES (680, '0002', '0001', '1142184470', 'On fait connaissance ?');
  19. INSERT INTO `pager` VALUES (681, '0002', '0001', '1142184520', 'On fait connaissance ?');
  20. INSERT INTO `pager` VALUES (682, '0002', '0002', '1142184598', 'Regarde mon profil ;) 22');
  21. INSERT INTO `pager` VALUES (683, '0002', '0001', '1142194739', 'J''suis trop fort !');
  22. INSERT INTO `pager` VALUES (684, '0002', '0002', '1142267587', 'Tu me plais !!');
  23. INSERT INTO `pager` VALUES (685, '0002', '0004', '1142452659', 'Tu me plais !!');
  24. INSERT INTO `pager` VALUES (686, '0002', '0002', '1142454948', 'Ecris moi stp !!');
  25. INSERT INTO `pager` VALUES (687, '0004', '0004', '1142455030', 'Veuillez Choisir');
  26. INSERT INTO `pager` VALUES (688, '0002', '0002', '1142455163', 'Veuillez Choisir');
  27. INSERT INTO `pager` VALUES (689, '0002', '0002', '1142459136', 'JTM');
  28. INSERT INTO `pager` VALUES (690, '0002', '0002', '1142543974', 'Ecris moi stp !!');
  29. INSERT INTO `pager` VALUES (691, '0002', '0002', '1142543997', 'Merci bien :)');
  30. INSERT INTO `pager` VALUES (692, '0002', '0002', '1142544052', 'Mon profil te convient?');
  31. INSERT INTO `pager` VALUES (693, '0004', '0004', '1142544223', 'Je t''ai envoyé un email');
  32. INSERT INTO `pager` VALUES (694, '0004', '0004', '1142544232', 'Je ne sais pas !');
  33. INSERT INTO `pager` VALUES (695, '0002', '0002', '1142607876', 'T''es en ligne ?');
  34. INSERT INTO `pager` VALUES (696, '0002', '0001', '1142608014', 'Le bruit est mieux non?');
  35. INSERT INTO `pager` VALUES (697, '0002', '0001', '1142608058', 'Le bruit est mieux non?');
  36. INSERT INTO `pager` VALUES (698, '0002', '0002', '1142608122', 'Mon profil te convient?');
  37. INSERT INTO `pager` VALUES (699, '0002', '0002', '1142684856', 'Merci bien :)');
  38. INSERT INTO `pager` VALUES (700, '0002', '0002', '1142685203', 'Je t''ai envoyé un email');
  39. INSERT INTO `pager` VALUES (701, '0011', '0002', '1143383405', 'message4');
  40. INSERT INTO `pager` VALUES (702, '0002', '0002', '1143414652', 'Hello Garçon !');
  41. INSERT INTO `pager` VALUES (703, '0002', '0002', '1143414694', 'yes !');
  42. INSERT INTO `pager` VALUES (704, '0002', '0002', '1143449360', 'test');
  43. INSERT INTO `pager` VALUES (705, '0002', '0002', '1143451357', 'test');
  44. INSERT INTO `pager` VALUES (706, '0002', '0002', '1143451375', 'Hey');
  45. INSERT INTO `pager` VALUES (707, '0002', '0002', '1143451568', 'zen !');
  46. INSERT INTO `pager` VALUES (708, '0004', '0002', '1143462959', 'message3');
  47. INSERT INTO `pager` VALUES (709, '0002', '0002', '1143466442', 'Test');
  48. INSERT INTO `pager` VALUES (710, '0002', '0001', '1143470051', 'sur la page profil :');
  49. INSERT INTO `pager` VALUES (711, '0002', '0001', '1143470062', 'mais ici bordel !');
  50. INSERT INTO `pager` VALUES (712, '0002', '0001', '1143470071', 'clique sur mon nom');
  51. INSERT INTO `pager` VALUES (713, '0001', '0002', '1143470266', 'test');
  52. INSERT INTO `pager` VALUES (714, '0002', '0001', '1143470303', 'si si ça fonctionne je te rassure !');
  53. INSERT INTO `pager` VALUES (715, '0001', '0002', '1143470318', 'message2');
  54. INSERT INTO `pager` VALUES (716, '0002', '0001', '1143470424', 'ce sont des accent : éèùàç');
  55. INSERT INTO `pager` VALUES (717, '0002', '0002', '1143471806', 'message1');
  56. INSERT INTO `pager` VALUES (718, '0002', '0002', '1143489877', 'Hello :)');


 
 
Merci :)
 
 
Sinon la technique de 10 entrées = 10 requètes pourquoi pas, mais ça risque de surcharger le serveur de façon monstre non :??: ?? Déjà là ça va pas être spécialement économique, mais alors avec 10 requètes [:markdavis]


---------------
Michael Schumacher laissera une trace immense dans l'histoire de notre sport. Il en a aussi laissé une belle sur les flancs de ma Williams à Adélaïde, en 1994...
n°1333510
jeoff
Posté le 28-03-2006 à 12:23:46  profilanswer
 

Essaye ça
 
SELECT P1.from, P1.to, P1.date, P1.message
FROM pager AS P1
WHERE P1.to = '0001'
     AND P1.DATE =  
              (SELECT max( P2.DATE )
               FROM pager AS P2
               WHERE P2.from = P1.from
               AND P2.to = '0001' )
GROUP BY P1.from
ORDER BY P1.date DESC
LIMIT 0 , 10

Message cité 1 fois
Message édité par jeoff le 28-03-2006 à 14:42:12
n°1333548
Syl_83
Already in the legend...
Posté le 28-03-2006 à 13:01:34  profilanswer
 

jeoff a écrit :

Essaye ça


 
 [:wam]
 
 
Ca fonctionne niquel [:chacal_one333]
 
 
Alors là merci [:aras qui rit]
 
 
 
 :jap:


---------------
Michael Schumacher laissera une trace immense dans l'histoire de notre sport. Il en a aussi laissé une belle sur les flancs de ma Williams à Adélaïde, en 1994...
n°1333576
jeoff
Posté le 28-03-2006 à 13:15:31  profilanswer
 


 
Le plus important n'étant pas que ça marche mais que tu comprennes comment ca marche ;)

n°1333621
Syl_83
Already in the legend...
Posté le 28-03-2006 à 13:44:22  profilanswer
 

jeoff a écrit :

Le plus important n'étant pas que ça marche mais que tu comprennes comment ca marche ;)


 
 
De ce que j'en ai compris : ça me cloisonne ma table en deux entités, P1 et P2 :D
 
 
J'aurai pas pu sortir ça directement à mon niveau, c'est clair et net mais une fois la requete sous les yeux et après l'avoir exploitée dans un fichier php...enfin je pense avoir saisi le sens de la requète, c'est déjà pas mal :whistle:


---------------
Michael Schumacher laissera une trace immense dans l'histoire de notre sport. Il en a aussi laissé une belle sur les flancs de ma Williams à Adélaïde, en 1994...
n°1333651
Djebel1
Nul professionnel
Posté le 28-03-2006 à 14:06:01  profilanswer
 

je me disais bien que les messages dans la table ressemblait à des vieux messages de site de rencontre avec hotesses (ou bot, au choix :p). Je comprends mieux en voyant la sign :D
 
Bah donc c'est bien, au moins on saura que nos messages sur ce site sont générés par des scripts ;)

mood
Publicité
Posté le 28-03-2006 à 14:06:01  profilanswer
 

n°1333670
mrbebert
Posté le 28-03-2006 à 14:21:54  profilanswer
 

Juste par curiosité, est-ce que quelque chose comme cela répond au problème ? :)  
 
SELECT P2.*
FROM (
  SELECT from, MAX(date) as date
  FROM pager
  WHERE to = '0001'
  GROUP BY from
  ORDER BY date DESC
  LIMIT 10
) AS P1
LEFT JOIN pager P2 ON P2.from=P1.from AND P2.date=P1.date
 [:figti]

n°1333693
jeoff
Posté le 28-03-2006 à 14:38:58  profilanswer
 

En dehors des problèmes de syntaxe, voilà ce que ça donne :
 

Code :
  1. requête SQL: Documentation
  2. SELECT P2 . *
  3. FROM (
  4. SELECT MAX( `date` ) AS date
  5. FROM `pager`
  6. WHERE `to` = '0001'
  7. GROUP BY `from`
  8. ORDER BY `date` DESC
  9. LIMIT 10
  10. ) AS P1
  11. LEFT JOIN pager P2 ON P2.from = P1.from
  12. AND P2.date = P1.date
  13. LIMIT 0 , 30
  14. MySQL a répondu:Documentation
  15. #1054 - Champ 'P1.from' inconnu dans on clause

n°1333763
mrbebert
Posté le 28-03-2006 à 15:53:03  profilanswer
 

Manque le "from" dans le SELECT de la requête interne :o
 
L'idée, c'est d'avoir une requête qui récupère la date du dernier message de chaque user (en ne gardant que les 10 plus récents. Un résultat de requête étant fortement similaire à une table (des lignes, des colonnes, quoi :D ) ,on fait une jointure entre ce résultat et la table qui permet de récupérer le message correspondant :)  
 
(Le dernier LIMIT est inutile :o )

n°1333768
Syl_83
Already in the legend...
Posté le 28-03-2006 à 15:58:05  profilanswer
 

Djebel1 a écrit :

je me disais bien que les messages dans la table ressemblait à des vieux messages de site de rencontre avec hotesses (ou bot, au choix :p). Je comprends mieux en voyant la sign :D
 
Bah donc c'est bien, au moins on saura que nos messages sur ce site sont générés par des scripts ;)


 
 
Rien à voir [:brainbugs]
 
 
Ca c'est la partie messages privés, les messages d'utilisateur à utilisateur :D
 
 
Ils sont limités à une trentaine de caractères et ne déclenchent pas l'envoi de mails, donc ils ne servent pas à grand chose en fait sinon à faire beau [:markdavis]
 
 
Les messages ont été écrits par moi et une seconde personne pour le besoin des tests [:aschrack]
 
 
Je certifie ne pas utiliser de bot ni de personne pour faire ça et ça restera le cas, au contraire d'un concurent très connu et leader de son segment en europe (non je ne citererai pas de nom :o ) qui a la facheuse manie d'envoyer des messages de ce genre 2 jours après la fin de l'abonnement du gars :o
 
 
Quoque ils certifient eux aussi ne pas utiliser de bots remarque :o


---------------
Michael Schumacher laissera une trace immense dans l'histoire de notre sport. Il en a aussi laissé une belle sur les flancs de ma Williams à Adélaïde, en 1994...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requete sql un peu spéciale

 

Sujets relatifs
Requete SQL ?[Hibernate][Criteria] je n'arrive pas à faire une requête spécial
Données dans un tableau suite à une requête[Oracle 9i]Export résultat de requête SQL vers fichier XML?
récuperer une seule valeur via une requete sqlrequête mysql pour récupérer plusieurs valeurs sur 1 champ
Requete complexe sur access /sqlRequête spéciale
Besoin d'aide pour une requete MySQL un peu spéciale (SELECT)[SQL] Requete spéciale avec des dates
Plus de sujets relatifs à : Requete sql un peu spéciale


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR