Requete sql un peu spéciale

Requete sql un peu spéciale - SQL/NoSQL - Programmation

Marsh Posté le 27-03-2006 à 20:45:39    

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...
Reply

Marsh Posté le 27-03-2006 à 20:45:39   

Reply

Marsh Posté le 27-03-2006 à 22:37:41    

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.

Reply

Marsh Posté le 28-03-2006 à 09:29:53    

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 :)

Reply

Marsh Posté le 28-03-2006 à 10:06:24    

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
Reply

Marsh Posté le 28-03-2006 à 11:04:54    

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...
Reply

Marsh Posté le 28-03-2006 à 12:23:46    

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
Reply

Marsh Posté le 28-03-2006 à 13:01:34    

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...
Reply

Marsh Posté le 28-03-2006 à 13:15:31    


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

Reply

Marsh Posté le 28-03-2006 à 13:44:22    

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...
Reply

Marsh Posté le 28-03-2006 à 14:06:01    

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 ;)

Reply

Marsh Posté le 28-03-2006 à 14:06:01   

Reply

Marsh Posté le 28-03-2006 à 14:21:54    

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]

Reply

Marsh Posté le 28-03-2006 à 14:38:58    

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

Reply

Marsh Posté le 28-03-2006 à 15:53:03    

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 )

Reply

Marsh Posté le 28-03-2006 à 15:58:05    

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...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed