Requête SQL sans erreur mais qui ne me revient pas !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requête SQL sans erreur mais qui ne me revient pas !

par Hubert Roksor » 11 mars 2008, 23:44

Je suis content que ça marche pour toi, mais j'aimerais insister sur le fait que ce n'est pas vraiment "ma" requête, je n'ai fait que la remettre en forme celle que tu as publiée. Ce que je veux dire, c'est que je ne sais pas ce que fait ta requête, je n'ai fait qu'appliquer mon "style" de SQL, et je prends ça comme le témoignage que de bonnes pratiques SQL peuvent parfois résoudre des problèmes à elles-seules.

Concernant les tables dérivées, je te laisse faire quelques recherches dans le forum ou autre, on en a parlé plusieurs fois. Pour résumer, tu prends une requête SELECT (uniquement si elle est capable de fonctionner "seule", en dehors de toute autre requête), tu la mets entre parenthèse, tu lui donnes un alias et tu peux alors la traiter comme une table. C'est plus performant qu'une sous-requête dans une autre clause parce qu'elle n'est exécutée qu'une seule fois pour toute ta requête, plutôt qu'une fois par enregistrements.

par Brian » 11 mars 2008, 21:17

Merci beaucoup, ta reqête fonctionne à merveille...

@+ Brian

PS: Il faudrait que je me documente sur les jointures car les produits cartésiens sont un peu passés de mode au vu de leur rapidité d'execution...
PS2: Pour les allias, j'aurai pu faire des efforts mais je trouve que cela nuit à la compréhension (humaine);
PS3: Pour les tables dérivées, je dois carrément tout apprendre car elles n'existaient pas à mes yeux il y a encore quelques secondes...
Un grand merci à toi.

par Hubert Roksor » 11 mars 2008, 00:43

Je sais pas pourquoi ta requête "ne marche pas" mais je peux au moins te proposer de clarifier ton SQL. Par exemple, à la place de

Code : Tout sélectionner

SELECT fsb_messages.message_id, fsb_messages.sujet_id, fsb_messages.message_texte, fsb_sujets.sujet_nom FROM fsb_messages,fsb_sujets WHERE fsb_messages.sujet_id=fsb_sujets.sujet_id
...tu peux utiliser

Code : Tout sélectionner

SELECT m.message_id, m.sujet_id, m.message_texte, s.sujet_nom FROM fsb_messages m JOIN fsb_sujets s USING (sujet_id)
Ensuite, on peut éclaircir un peu ta sous-requête

Code : Tout sélectionner

SELECT m.message_id, m.sujet_id, m.message_texte, s.sujet_nom FROM fsb_messages m JOIN fsb_sujets s USING (sujet_id) WHERE m.message_id IN ( SELECT MIN(message_id) FROM fsb_messages m2 JOIN fsb_sujets s2 USING (sujet_id) WHERE m2.message_texte LIKE '%shell%' OR s2.sujet_nom LIKE '%shell%' GROUP BY s.sujet_id )
Finalement, plutôt que d'utiliser une sous-requête dans IN(), ce qui est généralement lent, tu peux utiliser une table dérivée

Code : Tout sélectionner

SELECT m.message_id, m.sujet_id, m.message_texte, s.sujet_nom FROM ( SELECT MIN(m2.message_id) AS message_id FROM fsb_messages m2 JOIN fsb_sujets s2 USING (sujet_id) WHERE m2.message_texte LIKE '%shell%' OR s2.sujet_nom LIKE '%shell%' GROUP BY s2.sujet_id ) AS tmp JOIN fsb_messages m USING (message_id) JOIN fsb_sujets s USING (sujet_id)
Pour le reste, je ne sais pas. Essaie sans joindre la table de sujets pour voir ?

Requête SQL sans erreur mais qui ne me revient pas !

par Brian » 10 mars 2008, 23:38

Bonjour,

Je cherche à implémenter une fonction de recherche sur mon forum. J'ai donc écrit une requête SQL à cet effet elle ne contient pas d'erreur (à la compilitaion/interprétation) mais son éxécution prend un temp infini... Je dois avoir un malheureux produit cartésien... Ou alors c'est autre chose... Qui a une idée ? Merci.

@+ Brian

PS: SGBD=MySQL

Code : Tout sélectionner

SELECT fsb_messages.message_id, fsb_messages.sujet_id, fsb_messages.message_texte, fsb_sujets.sujet_nom FROM fsb_messages,fsb_sujets WHERE fsb_messages.sujet_id=fsb_sujets.sujet_id AND fsb_messages.message_id IN (SELECT MIN(message_id) FROM fsb_messages, fsb_sujets WHERE fsb_messages.sujet_id=fsb_sujets.sujet_id AND ((fsb_messages.message_texte LIKE '%shell%') OR (fsb_sujets.sujet_nom LIKE '%shell%')) GROUP BY fsb_sujets.sujet_id) -- -- Structure de la table 'fsb_messages' -- CREATE TABLE fsb_messages ( message_id int(11) NOT NULL auto_increment, forum_id mediumint(9) NOT NULL default '0', sujet_id int(11) NOT NULL default '0', membre_id int(11) NOT NULL default '0', pseudo_posteur varchar(30) collate latin1_general_ci NOT NULL default '', message_texte text collate latin1_general_ci NOT NULL, message_temps int(20) NOT NULL default '0', message_ip varchar(20) collate latin1_general_ci NOT NULL default '', PRIMARY KEY (message_id), KEY message_id (message_id), KEY sujet_id (sujet_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; -- -------------------------------------------------------- -- -- Structure de la table 'fsb_sujets' -- CREATE TABLE fsb_sujets ( sujet_id int(11) NOT NULL auto_increment, forum_id int(11) NOT NULL default '0', membre_id int(11) NOT NULL default '0', sujet_nom varchar(250) collate latin1_general_ci NOT NULL default '', nb_vu int(11) NOT NULL default '0', nb_reponse int(11) NOT NULL default '0', dernier_message_id int(11) NOT NULL default '0', dernier_message_temps int(11) NOT NULL default '0', premier_message_id int(11) NOT NULL default '0', sujet_type smallint(6) NOT NULL default '0', sujet_status tinyint(4) NOT NULL default '1', PRIMARY KEY (sujet_id), UNIQUE KEY sujet_id (sujet_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;