[MySQL] j'arrive pas à faire une requête ...

j'arrive pas à faire une requête ... [MySQL] - Programmation

Marsh Posté le 07-04-2002 à 16:08:49    

:hello:  
je n'arrive pas à récupérer les infos en une seule requête.
Voici les champs (intéressants) de la table incriminée :

Code :
  1. post_id  topic_id  forum_id  post_time
  2. 1        1         6         980497583
  3. 2        1         6         980542050
  4. 3        1         6         980704070
  5. 4        2         6         980769962
  6. 5        3         6         982425368
  7. ....


je voudrais en une seule requête récupérer le post_id du plus grand post_time donné pour un topic_id donné.
voilà ce que j'utilisais :

Code :
  1. select max(post_time), post_id
  2. from phpbb_posts
  3. where topic_id = '1'
  4. and forum_id = '6'
  5. group by topic_id


 
ce qui me donne le post_time maximum (ça c cool) mais pas le post_id correspondant, mais le premier trouvé correspondant au bon topic_id et forum_id.
 
(j'ai trouvé une solution bien sûr, en faisant 2 requêtes successives, mais j'aimerais comprendre pourkoi celle-ci marche pas)

 

[jfdsdjhfuetppo]--Message édité par z0rglub--[/jfdsdjhfuetppo]


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:08:49   

Reply

Marsh Posté le 07-04-2002 à 16:37:33    

euh,
 
essaie

Code :
  1. select post_id
  2. from phpbb_posts
  3. where topic_id = "1"
  4. and post_time = (select max(pos_time)
  5.                  from phpbb_posts
  6.                  where topic_id = "1" ));


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-04-2002 à 16:39:09    

je crois que ca devrait marcher mais ca ne doit pas etre la solution la plus efficace en termes de perf...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-04-2002 à 16:40:07    

DarkLord a écrit a écrit :

je crois que ca devrait marcher mais ca ne doit pas etre la solution la plus efficace en termes de perf...  




 
j'essaie même pas, pas parce que c'est toi :) mais parce que MySQL (SGBD assez rudimentaire) ne supporte pas les select imbriqués


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:41:06    

z0rglub a écrit a écrit :

 
 
j'essaie même pas, pas parce que c'est toi :) mais parce que MySQL (SGBD assez rudimentaire) ne supporte pas les select imbriqués  



Ah bon ?

Reply

Marsh Posté le 07-04-2002 à 16:41:48    

vous semez le doute dans mon esprit tout à coup, je vais essayer


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:42:26    

z0rglub a écrit a écrit :

vous semez le doute dans mon esprit tout à coup, je vais essayer  



MySQL est une base de données simple, mais pas simpliste !

Reply

Marsh Posté le 07-04-2002 à 16:43:49    

Code :
  1. requête SQL : 
  2. select post_id
  3. from phpbb_posts
  4. where topic_id = '1'
  5. and forum_id = '6'
  6. and post_time in (select max(post_time)
  7.                 from phpbb_posts
  8.                 where topic_id = '1')) LIMIT 0, 30
  9. MySQL a répondu:
  10. Something is wrong in your syntax près de 'select max(post_time)
  11.                 from phpbb_posts
  12.        ' à la ligne 5


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:44:24    

z0rglub a écrit a écrit :

 
 
j'essaie même pas, pas parce que c'est toi :) mais parce que MySQL (SGBD assez rudimentaire) ne supporte pas les select imbriqués  




 
bin je ne sais pas si tu peux le faire en une seule requete alors (sans select imbriqués je veux dire). Et ca m'étonnerait que MySQL ne sache pas faire ca ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-04-2002 à 16:45:10    

Cherrytree a écrit a écrit :

MySQL est une base de données simple, mais pas simpliste !  




 
tu as déjà réussi à faire des select imbriqués ? parce que si oui, dis moi comment... ça m'intéresserai pas mal


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:45:10   

Reply

Marsh Posté le 07-04-2002 à 16:45:19    

j'ai mis une paranthèse de trop aussi


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-04-2002 à 16:47:18    

tu es sur de ton select max ... IN  ???


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-04-2002 à 16:48:00    

Les SELECT imbriqués, je les ai pratiqué sous DB2, mais comme c'est du SQL de base, je ne vois pas ce qui empêcherait de le faire sous MySQL. Par contre, ma dernière requête remonte à loin. J'ai pas trop le temps now. Sorry !

Reply

Marsh Posté le 07-04-2002 à 16:49:15    

(on dirait bla bla...)
j'ai mis '=' marchait pas puis 'IN' (souvenir de mes cours de SQL) et marche pas non plus (avec ou sans la parenthèse de trop)


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:51:29    

ouais, franchement ah moins qu'on arrive à me prouver le contraire (et vu que j'utilise MySQL depuis 1 an) je continue à penser que MySQL ne gère pas les select imbriqués


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 16:58:26    

Citation :


MySQL Server currently only supports nested queries of the form INSERT ... SELECT ... and REPLACE ... SELECT .... You can however use the function IN() in other contexts. Sub-selects are scheduled for implementation in Version 4.x.  
 
Meanwhile, you can often rewrite the query without a sub-select:  
 
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
 
This can be re-written as:  
 
SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
 
The queries:  
 
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
                                       WHERE table1.id=table2.id);
 
Can be rewritten as:  
 
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
                                       WHERE table2.id IS NULL;
 
For more complicated subqueries you can often create temporary tables to hold the subquery. In some cases, however this option will not work. The most frequently encountered of these cases arises with DELETE statements, for which standard SQL does not support joins (except in sub-selects). For this situation there are two options available until subqueries are supported by MySQL Server.  
 
The first option is to use a procedural programming language (such as Perl or PHP) to submit a SELECT query to obtain the primary keys for the records to be deleted, and then use these values to construct the DELETE statement (DELETE FROM ... WHERE ... IN (key1, key2, ...)).  
 
The second option is to use interactive SQL to construct a set of DELETE statements automatically, using the MySQL extension CONCAT() (in lieu of the standard || operator). For example:  
 
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';';)
  FROM tab1, tab2
 WHERE tab1.col1 = tab2.col2;
 
You can place this query in a script file and redirect input from it to the mysql command-line interpreter, piping its output back to a second instance of the interpreter:  
 
shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb
 
MySQL Server 4.0 supports multi-table deletes that can be used to efficiently delete rows based on information from one table or even from many tables at the same time.  


 
http://www.mysql.com/documentation [...] index.html


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-04-2002 à 17:02:17    

thx pour la doc, ça confirme ce que je pensais, pas de select imbriqués.... faut trouver des astuces avec des jointures quand c'est possible


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 17:34:09    

Putain il a quoi là le foum, il déconne ?????
 
En tout cas voici l'adresse d'un de mes posts où j'ai résolu un pb d'imbrication avec MySQL :
http://forum.hardware.fr/forum2.ph [...] =1&trash=0
Je sais pas si ça va te servir mais regarde quand même.

Reply

Marsh Posté le 07-04-2002 à 17:40:06    

mais que je suis con, j'avais déjà utilisé cette ruse de sioux (le order by + limit 0,1). C'est vraiment ce qu'on appelle une ruse, mais bon, MySQL ne permet pas de faire mieux, en tout cas, merci pour ce petit rafraichissement de mémoire


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 17:42:51    

je laisse pas en plan ceux qui ont pas tout compris, voilà le code à mettre :

Code :
  1. select post_id, post_time
  2. from phpbb_posts
  3. where topic_id = '1'
  4. and forum_id = '6'
  5. order by post_time desc
  6. limit 0,1


 
qui me retourne ce que je veux :

Code :
  1. post_id  post_time 
  2. 11       988374027

 

[jfdsdjhfuetppo]--Message édité par z0rglub--[/jfdsdjhfuetppo]


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 07-04-2002 à 17:49:17    

Eh bien finalement ça t'a aidé...

 

[jfdsdjhfuetppo]--Message édité par Dost67--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-04-2002 à 17:54:09    

J'en reviens toujours pas qu'il soit impossible de faire des requêtes imbriquées :sweat:

Reply

Marsh Posté le 07-04-2002 à 17:56:27    

et oui, moi aussi quand je m'en suis rendu compte gt sur le cul


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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