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

 


Dernière réponse
Sujet : [MySQL] j'arrive pas à faire une requête ...
z0rglub et oui, moi aussi quand je m'en suis rendu compte gt sur le cul

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
z0rglub et oui, moi aussi quand je m'en suis rendu compte gt sur le cul
Cherrytree J'en reviens toujours pas qu'il soit impossible de faire des requêtes imbriquées :sweat:
Dost67 Eh bien finalement ça t'a aidé...

 

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

z0rglub 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]

z0rglub 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
Dost67 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.
z0rglub 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
darklord

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

z0rglub 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
z0rglub (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)
Cherrytree 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 !
darklord tu es sur de ton select max ... IN  ???
darklord j'ai mis une paranthèse de trop aussi
z0rglub

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

darklord

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

z0rglub

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

Cherrytree

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 !

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

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 ?

z0rglub

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

darklord je crois que ca devrait marcher mais ca ne doit pas etre la solution la plus efficace en termes de perf...
darklord 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" ));

z0rglub :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]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)