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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

[SQL] un coup de main pour rouler mon join?

n°1270216
leflos5
On est ou on est pas :)
Posté le 19-12-2005 à 19:43:22  profilanswer
 

Reprise du message précédent :

cinocks a écrit :

tout à fait. Sinon on ne se ferait pas chier avec un subselect.
 
Mais un order by desc est plus approprié. D'ailleurs, on va supprimer les fonctions d'aggregats. Ca ne sert à rien.


Toi tu commences par ravaler ton orgueil et tu admets que t'as tord, même si c'est juste une fois, l'erreur est humaine, hein ;)
 
Que tu saches pas comment faire sans sous requête (sub select comprends pas moi...) c'est une chose, que ça soit pas possible sans...
 
Donc tu restes humble et avant de devoir admettre de force je te laisse le temps depuis le début de trouver seul :)
 
J'adore toujours autant la confiture, c'est trop bon surtout de la voir sur les tartines des autres :p
 
edit: qui t'as parler d'order by, y'en a pas besoin en plus  :sarcastic:


Message édité par leflos5 le 19-12-2005 à 19:44:19
mood
Publicité
Posté le 19-12-2005 à 19:43:22  profilanswer
 

n°1270229
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 20:10:07  profilanswer
 

Moi je maintiens, je suis preneur d'une solution sans sub-select.
 
Sans être aussi "intégriste" que cinocks, très franchement, je n'y crois pas une seconde, et je demande à voir.
 
En tout cas, cinocks "te parle mal", mais pas plus que toi qui nous prend pour de sombres crétins.
 
Je pense que les personnes les plus callées en SQL de ce forum ont déjà participé à ce topic (je ne te présente pas Joce, membre de l'équipe de dev de MySQL entre autres), et on est tous tombés d'accord sur l'impossibilité de faire sans sous requête.
 
Après, par expérience, je m'attends au pire, et du coup je parle d'une solution "propre", c'est à dire sans spécificités ni requête de 4 kilomètres (parceque sinon, autant faire une sous-requête c'est pas plus lent).

n°1270232
leflos5
On est ou on est pas :)
Posté le 19-12-2005 à 20:17:47  profilanswer
 

Arjuna a écrit :

Moi je maintiens, je suis preneur d'une solution sans sub-select.
 
Sans être aussi "intégriste" que cinocks, très franchement, je n'y crois pas une seconde, et je demande à voir.
 
En tout cas, cinocks "te parle mal", mais pas plus que toi qui nous prend pour de sombres crétins.
 
Je pense que les personnes les plus callées en SQL de ce forum ont déjà participé à ce topic (je ne te présente pas Joce, membre de l'équipe de dev de MySQL entre autres), et on est tous tombés d'accord sur l'impossibilité de faire sans sous requête.
 
Après, par expérience, je m'attends au pire, et du coup je parle d'une solution "propre", c'est à dire sans spécificités ni requête de 4 kilomètres (parceque sinon, autant faire une sous-requête c'est pas plus lent).


Si le Joce est le Joce de ce forum qui s'est fait hacké méchament, on peut pas penser à tout soit je le sais, mais le vends pas en maitre STP ;)
 
Et c'est encore pire s'il fait partie de l'équipe qui développe un truc qu'il sait même pas utiliser  :ouch:  
 
Maintenant je sais bien que c'est pas le premier truc qui vient à l'esprit, mais c'est simple et loi des 4km ;)
 
Group by ça sert à quoi :??: On a juste 2 tables et une pauvre jointure :) Donc je demande sincèrement à quoi ça sert de faire une sous requête :)
 
Et puis c'est du SQL de base enseigné dans les études de base! Donc pourquoi cherché compliqué, même si l'habitude du compliqué est le quotidient, faut savoir faire simple ;)
 
Et la qui peut le plus, peut apparement pas le moins, c'est triste  :(


Message édité par leflos5 le 19-12-2005 à 20:20:18
n°1270233
cinocks
Posté le 19-12-2005 à 20:20:31  profilanswer
 

j'attends que tu me cites la methode dont tu me parles. Mets-moi la requete en question permettant de recuperer ce qu'il faut, et on commence à en parler. ;)


---------------
MZP est de retour
n°1270240
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 20:28:55  profilanswer
 

Poste ta science vin dieu.
 
On est tous avides de voir ta solution.

n°1270243
cinocks
Posté le 19-12-2005 à 20:31:55  profilanswer
 

J'ai relu les posts. Et pour le moment je ne vois pas.
Je précise que la question est bien de retourner pour chaque adresse, le prix actuellement en vigueur.


Message édité par cinocks le 19-12-2005 à 20:32:14

---------------
MZP est de retour
n°1270249
cinocks
Posté le 19-12-2005 à 20:43:34  profilanswer
 

Punaise pour du SQL de base enseigné dans les études de base, c'est long. Pour le moment la confiture...


---------------
MZP est de retour
n°1270250
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 20:44:12  profilanswer
 

lelfos5 > t'es un super génie, on est tous contents pour toi.
 
Seulement, je crois que t'as un peu zappé le rôle d'un forum, ou tout du moins celui-ci.
T'es pas là seulement pour te faire mousser, t'es là aussi pour apporter des solutions à ceux qui les demandent.
 
Alors soit tu postes enfin ta solution, soit du nous laisse jouer avec notre caca tout mou, mais faut que tu te décides rapidement maintenant.

n°1270252
cinocks
Posté le 19-12-2005 à 20:46:35  profilanswer
 

J'ai eu un doute à un moment. La seule solution que je voyais de probable etait de faire :
 

Code :
  1. SELECT a.nom, a.adresse, max(p.prix)
  2. FROM adresse a INNER JOIN prix p ON (p.id = a.id)
  3. GROUP BY a.nom, a.adresse
  4. HAVING p.datetime = max(p.datetime)


 
Bien sur ca ne passe pas. Il ne sait trouver le p.datetime. Normal, il ne figure pas dans la liste des champs selectionnés.


---------------
MZP est de retour
n°1270255
mrbebert
Posté le 19-12-2005 à 20:50:36  profilanswer
 

Je connais un moyen de faire sans sub-select mais bon, il y a un risque sérieux de crise cardiaque chez les puristes :o :D  
C'est un coup à se faire bannir définitivement de la section :whistle:

mood
Publicité
Posté le 19-12-2005 à 20:50:36  profilanswer
 

n°1270257
cinocks
Posté le 19-12-2005 à 20:51:27  profilanswer
 

On est pret à tout. :D


---------------
MZP est de retour
n°1270260
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 20:55:10  profilanswer
 

mrbebert a écrit :

Je connais un moyen de faire sans sub-select mais bon, il y a un risque sérieux de crise cardiaque chez les puristes :o :D  
C'est un coup à se faire bannir définitivement de la section :whistle:


cette solution ce rapproche grandement de l'éventuellité que j'imagine (la création d'un truc qui sort tout droit de sa carverne une nuit de pleine lune :D)
 
m'enfin la maintenabilité étant de mise... (et tout le monde ne dormant pas sur un lit d'os au fond d'une grotte humide...)

n°1270278
mrbebert
Posté le 19-12-2005 à 21:20:46  profilanswer
 

Bon, tout d'abord, je précise que ce n'est pas de moi, je l'ai vu sur le site de MySQL :D  
 
Ca se base sur quelques remarques :
- un champ de type "date" ou "datetime" sera trié dans le même ordre selon qu'on se base directement sur le champ (ordre chronologique) ou sur sa représentation textuelle (ordre alphabétique)
- dans un tri de chaînes de caractères, c'est la partie gauche qui compte le plus. Si "BBB" est > à "AAA", alors si on concatène ce qu'on veut à "BBB", le résultat sera toujours > à "AAA" auquel on aura concaténé n'importe quoi
 
A partir de là, tout s'enchaîne : on va concatèner la date (à gauche) avec le prix (à droite), prendre le MAX de cette chaîne de caractère (donc le datetime le plus grand) et enfin récupérer le prix dans la partie droite de la chaîne de caractères :)  
 
Ca donne un truc du genre (en considérant qu'un "datetime" est sur 19 caractères) :
SELECT Adresses.*, SUBSTR(MAX(CONCAT(Prix.datetime,Prix.prix)), 20) AS prix
FROM Adresses, Prix
WHERE Adresses.id = Prix.id
GROUP BY Adresses.id
 
 :whistle:  :whistle:  :D

n°1270290
leflos5
On est ou on est pas :)
Posté le 19-12-2005 à 21:28:39  profilanswer
 

Arjuna a écrit :

lelfos5 > t'es un super génie, on est tous contents pour toi.
 
Seulement, je crois que t'as un peu zappé le rôle d'un forum, ou tout du moins celui-ci.
T'es pas là seulement pour te faire mousser, t'es là aussi pour apporter des solutions à ceux qui les demandent.
 
Alors soit tu postes enfin ta solution, soit du nous laisse jouer avec notre caca tout mou, mais faut que tu te décides rapidement maintenant.


Je penses que celui qui se pose la question a de quoi y répondre ;) C'était juste pour les génies méprisants dont tu fais pas partie ;)
 
Donc ils vont se retourner le cerveau s'ils veulent se remettre en cause :) Moi je referais parler de moi que plus tard (on peut bien laisser un jour ;) )

n°1270309
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 21:54:49  profilanswer
 

mrbebert a écrit :

Bon, tout d'abord, je précise que ce n'est pas de moi, je l'ai vu sur le site de MySQL :D  
 
Ca se base sur quelques remarques :
- un champ de type "date" ou "datetime" sera trié dans le même ordre selon qu'on se base directement sur le champ (ordre chronologique) ou sur sa représentation textuelle (ordre alphabétique)
- dans un tri de chaînes de caractères, c'est la partie gauche qui compte le plus. Si "BBB" est > à "AAA", alors si on concatène ce qu'on veut à "BBB", le résultat sera toujours > à "AAA" auquel on aura concaténé n'importe quoi
 
A partir de là, tout s'enchaîne : on va concatèner la date (à gauche) avec le prix (à droite), prendre le MAX de cette chaîne de caractère (donc le datetime le plus grand) et enfin récupérer le prix dans la partie droite de la chaîne de caractères :)  
 
Ca donne un truc du genre (en considérant qu'un "datetime" est sur 19 caractères) :
SELECT Adresses.*, SUBSTR(MAX(CONCAT(Prix.datetime,Prix.prix)), 20) AS prix
FROM Adresses, Prix
WHERE Adresses.id = Prix.id
GROUP BY Adresses.id
 
 :whistle:  :whistle:  :D


ha ouais. si ça te gratte derrière les oreilles, c'est pas grave, c'est la mousse :D

n°1270314
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 22:01:35  profilanswer
 

leflos5 a écrit :

Je penses que celui qui se pose la question a de quoi y répondre ;) C'était juste pour les génies méprisants dont tu fais pas partie ;)
 
Donc ils vont se retourner le cerveau s'ils veulent se remettre en cause :) Moi je referais parler de moi que plus tard (on peut bien laisser un jour ;) )


si t'attends que je me prenne la tête sur cette requête, tu va avoir de la mousse sur les épaules avant moi.
 
la solution de mrbebert fonctionne en effet, seulement le gars qui a trouvé ça, en plus d'être un autiste fini, a des problèmes à se faire pour trouver un boulot dans une équipe... et le conserver !
pondre un truc comme ça, c'est l'assurance de faire un code absolument immaintenable, c'est à dire un motif de licensiement pour faute lourde si on prouve que ça a été pondu sciemment.
 
niveau optimisation, j'ai de plus quelques TRES gros doutes.
 
pourquoi ?
-> Concaténer deux types "datetime" et "float" (ou number), déjà, ça bouffe des ressources à mort, puisqu'il faut déjà les caster, et l'un comme l'autre, c'est extrêment consommateur à faire.
-> Dès que tu fais un cast sur un type, tu peux dire "aurevoir" à tous tes index. preuve ? trie par ordre croissant un champ numérique, puis le même champ que tu cast en varchar. Idem pour un champ datetime. Edifiant n'est-ce pas ?
-> Une fois qu'on a fini ça, on va aller faire un MAX sur une variable de type varchar... Idem, ça demande le calcul de TOUTES les valeurs avant de pouvoir commencer à faire quoi que ce soit. J'imagine la tronche du serveur avec plusieurs millions de lignes...
-> Enfin, un petit substr sur le résultat du max... comparativement à tout ce qui c'est passé avant, le serveur peut enfin se reposer un peu... comme un faux plat à vélo après une côte quoi.

n°1270315
cinocks
Posté le 19-12-2005 à 22:03:03  profilanswer
 

leflos5 a écrit :

Je penses que celui qui se pose la question a de quoi y répondre ;) C'était juste pour les génies méprisants dont tu fais pas partie ;)
 
Donc ils vont se retourner le cerveau s'ils veulent se remettre en cause :) Moi je referais parler de moi que plus tard (on peut bien laisser un jour ;) )


 
Tu es le génie de l'esquive.  [:ministry]


---------------
MZP est de retour
n°1270457
joce
Architecte / Développeur principal
"BugHunter"
Posté le 20-12-2005 à 09:05:18  profilanswer
 

leflos5 a écrit :

Je penses que celui qui se pose la question a de quoi y répondre ;) C'était juste pour les génies méprisants dont tu fais pas partie ;)
 
Donc ils vont se retourner le cerveau s'ils veulent se remettre en cause :) Moi je referais parler de moi que plus tard (on peut bien laisser un jour ;) )


écoute, c'est un problème connu et reconnu cette requète, je ne compte plus le nombre de fois où j'ai vu passer la question sur la mailing de MySQL :d
Si tu penses à faire un SELECT id, MAX(date), prix ... GROUP BY id, tu as perdu, parce que le "prix" affiché de sera pas forcement celui associé à MAX(date).
sans subselect, la solution sur le site de MySQL est la seule qui existe pour résoudre ce style de requète.


Message édité par joce le 20-12-2005 à 09:06:05
n°1270468
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-12-2005 à 09:24:48  profilanswer
 

moi en tout cas, j'en veux pas de leur solution, c'est encore moins pire de faire un "select max(date), id ... group by id" puis pour chaque ligne, à la main comme un goret un "select prix ... where id = $id and date = $maxdate"
Si ça se trouve, même nivau perfs c'est à peine pire (MySQL gérant assez bien les ouvertures/fermetures de connexions logiques). Et dans tous les cas, n'importe quel stagiaire sera capable de relire et comprendre le code sans passer 2 semaines à se prendre la tête...

n°1270493
cinocks
Posté le 20-12-2005 à 09:52:34  profilanswer
 

honnetement, je parie sur le subselect de suite. Plutot que sur des fonctions de transformations.


---------------
MZP est de retour
n°1270504
chrisbk
-
Posté le 20-12-2005 à 10:01:10  profilanswer
 

tenu !

n°1270562
cinocks
Posté le 20-12-2005 à 11:13:21  profilanswer
 

Qui se fait chi** pour nous preparer un jeu de test? :D


---------------
MZP est de retour
n°1270570
mrbebert
Posté le 20-12-2005 à 11:27:22  profilanswer
 

J'ai fait quelques tests, il semble que ce soit ma requête qui est la plus rapide :ouch:  :whistle:  :lol:

n°1270581
mrbebert
Posté le 20-12-2005 à 11:38:58  profilanswer
 

Je vous met mon jeu de tests :
 
Création des tables :

CREATE TABLE Adresses (id INT NOT NULL,       nom CHAR(8) NOT NULL, adresse CHAR(52) NOT NULL);
CREATE TABLE Prix     (id INT NOT NULL, datetime DATETIME NOT NULL,         prix INT NOT NULL);


 
Chargement (script PHP) :

<?
mysql_connect('localhost','root','');
mysql_select_db('test');
 
for ($id = 1 ; $id <= 200 ; ++$id) {
  mysql_query("INSERT INTO Adresses VALUES($id, 'id-$id', '$id rue de nulle part')" );
}
 
for ($id = 1 ; $id <= 200 ; ++$id)
  for ($j = 1 ; $j <= 10 ; ++$j) {
    $dt = rand(2002,2005) . '-' . rand(1,12) . '-' . $j . ' 01:02:03';
    $prix = rand(10,1000);
    mysql_query("INSERT INTO Prix VALUES($id, '$dt', $prix)" );
}
?>

Donc, 200 adresses, et 10 prix pour chacun.
 
Et les requêtes :

# requete 1
SELECT a.nom, a.adresse, p.prix  
FROM Adresses a INNER JOIN Prix p ON (p.id = a.id)  
WHERE p.datetime = (SELECT max(p1.datetime) FROM prix p1 WHERE p1.id = p.id)
 
# requete 2
SELECT *  
FROM Adresses as a, Prix as p  
WHERE a.id = p.id AND  
      p.datetime = ( SELECT p1.datetime  
                 FROM Prix as p1  
                 WHERE p1.id=p.id  
                 ORDER BY p1.datetime DESC  
                 LIMIT 1);
 
# requete 3
SELECT Adresses.*, Prix.prix  
FROM adresses, Prix  
WHERE Adresses.id=Prix.id  
AND ROW(Prix.id, Prix.datetime) IN (  
    SELECT id, MAX(datetime) AS dt_max  
    FROM Prix  
    GROUP BY id  
  ) ;
 
# requete 4
SELECT Adresses.*, SUBSTR(MAX(CONCAT(Prix.datetime,Prix.prix)), 20) AS prix  
FROM Adresses, Prix  
WHERE Adresses.id = Prix.id  
GROUP BY Adresses.id;


 
Le tout sur un P4 3.00 Ghz, MySQL 4.1.10 :)  
 
Les résultats :D  
La requête 1, je l'ai tuée au bout de 860 secondes :whistle:  
Requête 2 : 5 sec
Requête 3 : 1 min 50
Requête 4 : moins d'1 seconde :D  

n°1270608
cinocks
Posté le 20-12-2005 à 12:27:21  profilanswer
 

C'est plutot bizarre ta chose. Si je prend la premiere requete, dans le pire des cas, je dis bien le pire elle va faire une premiere jointure avec 2000 resultats. Et pour faire crade, faire une recherche parmi 10 pour ces 2000 resultats. Meme sans index, c'est fait en 10 secondes sans probleme.
 
La 2 revient à la meme chose que la premiere sur le volume généré. Car il faut trouver tout les resultats pour un id donné avant de definir le premier ordonné.
 
J'ai commencé un jeu d'essai sur mon serveur. Mais n'ayant pas les subselect, je suis un peu coincé.
 
Bon, premier constat, les index devraient exister. ;)


---------------
MZP est de retour
n°1270627
mrbebert
Posté le 20-12-2005 à 13:21:43  profilanswer
 

Oui, en définissant Adresses.id en clé primaire et en indexant Prix.id, les 2 premières requêtes sont instantanées (moins d'1 seconde) :)  
Par contre, la 3ème met encore une trentaine de secondes [:figti]

n°1270630
mrbebert
Posté le 20-12-2005 à 13:25:40  profilanswer
 

cinocks a écrit :

C'est plutot bizarre ta chose. Si je prend la premiere requete, dans le pire des cas, je dis bien le pire elle va faire une premiere jointure avec 2000 resultats. Et pour faire crade, faire une recherche parmi 10 pour ces 2000 resultats. Meme sans index, c'est fait en 10 secondes sans probleme.
...

Je dirais plutôt qu'elle fait une première jointure et, pour chacun des 2000 résultats, elle fait une recherche sur l'ensemble de la table Prix (2000 lignes) [:figti]  

n°1270631
cinocks
Posté le 20-12-2005 à 13:26:11  profilanswer
 

Maintenant l'interet serait de le faire sur un vrai jeu d'essai, du volume quoi.


---------------
MZP est de retour
n°1270634
cinocks
Posté le 20-12-2005 à 13:28:29  profilanswer
 

mrbebert a écrit :

Je dirais plutôt qu'elle fait une première jointure et, pour chacun des 2000 résultats, elle fait une recherche sur l'ensemble de la table Prix (2000 lignes) [:figti]


 
oui, c'est ce qu'il fait puisque pas d'index.


---------------
MZP est de retour
n°1270637
mrbebert
Posté le 20-12-2005 à 13:29:44  profilanswer
 

Je vais le refaire avec 1000 adresses et 15.000 prix
(en version "avec index", sinon ce serait trop long :o )

Message cité 1 fois
Message édité par mrbebert le 20-12-2005 à 13:30:53
n°1270670
mrbebert
Posté le 20-12-2005 à 13:54:22  profilanswer
 

mrbebert a écrit :

Je vais le refaire avec 1000 adresses et 15.000 prix
(en version "avec index", sinon ce serait trop long :o )

La requête 3 est aux choux.
Le 1 se fait en environ 1,6 sec, la 2 en 2,3 sec ... et la 4 en moins de 0,2 sec :)  

n°1270703
cinocks
Posté le 20-12-2005 à 14:13:56  profilanswer
 

Question idiote. Mais tu as bien les memes résultats? :D


---------------
MZP est de retour
n°1270740
mrbebert
Posté le 20-12-2005 à 14:35:02  profilanswer
 

Oui, bien sur :D  
Du moins, les 10 derniers enregistrements, j'ai pas tout vérifié non plus :o

n°1270752
cinocks
Posté le 20-12-2005 à 14:45:17  profilanswer
 

Et ta requete est executée sous phpMyAdmin?


---------------
MZP est de retour
n°1270861
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 20-12-2005 à 16:15:49  profilanswer
 

cinocks a écrit :

C'est plutot bizarre ta chose. Si je prend la premiere requete, dans le pire des cas, je dis bien le pire elle va faire une premiere jointure avec 2000 resultats. Et pour faire crade, faire une recherche parmi 10 pour ces 2000 resultats. Meme sans index, c'est fait en 10 secondes sans probleme.
 
La 2 revient à la meme chose que la premiere sur le volume généré. Car il faut trouver tout les resultats pour un id donné avant de definir le premier ordonné.
 
J'ai commencé un jeu d'essai sur mon serveur. Mais n'ayant pas les subselect, je suis un peu coincé.
 
Bon, premier constat, les index devraient exister. ;)


faut voir que MySQL transforme les subselect en requete de type EXISTS, et que les subselects seront toujours plus lent qu'une requete sans :o

Message cité 1 fois
Message édité par joce le 20-12-2005 à 16:16:51
n°1270876
mrbebert
Posté le 20-12-2005 à 16:29:40  profilanswer
 

cinocks a écrit :

Et ta requete est executée sous phpMyAdmin?

Non, par le client en ligne de commande. Le client comme le serveur fonctionnent en local :)  

n°1271024
cinocks
Posté le 21-12-2005 à 07:55:54  profilanswer
 

joce a écrit :

faut voir que MySQL transforme les subselect en requete de type EXISTS, et que les subselects seront toujours plus lent qu'une requete sans :o


 
Je pensais tout de même que ce serait plus rapide que faire des transformations. Je suis étonné du résultat.  [:payzan]


---------------
MZP est de retour
n°1271026
cinocks
Posté le 21-12-2005 à 07:57:23  profilanswer
 

mrbebert a écrit :

Non, par le client en ligne de commande. Le client comme le serveur fonctionnent en local :)


 
comme dit à Joce, je suis étonné du resultat. Merci d'avoir fait le test :jap:


---------------
MZP est de retour
n°1271037
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-12-2005 à 09:12:17  profilanswer
 

étonné aussi.
 
mysql, y'a des bouts optimisés, mais ils ont franchement oublié de penser à optimiser les parties qui permettent de conserver un code lisible :o
 
on va dire que c'est parceque les subselect sous mysql sont jeunes encore. parceque sur sql server comme sous oracle, les subselect n'ont aucun impact sur les performances (mise à part les cas tordus, notamment quand on transforme un champ, ce qu'on ne fait pas dans les requêtes ci-dessus)

n°1271054
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 21-12-2005 à 09:52:55  profilanswer
 

perso je pense pas que transformer la requète en truc de type EXISTS soit toujours la bonne solution :D

n°1271055
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 21-12-2005 à 10:00:35  profilanswer
 

Requète 1 :
 

+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                                                                                                  |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1276 | Field or reference 'p.id' of SELECT #2 was resolved in SELECT #1                                                                                                                                                                                                                                                                                         |
| Note  | 1003 | select `test`.`a`.`nom` AS `nom`,`test`.`a`.`adresse` AS `adresse`,`test`.`p`.`prix` AS `prix` from `test`.`Adresses` `a` join `test`.`Prix` `p` where ((`test`.`p`.`id` = `test`.`a`.`id`) and (`test`.`p`.`datetime` = (select max(`test`.`p1`.`datetime`) AS `max(p1.datetime)` from `test`.`prix` `p1` where (`test`.`p1`.`id` = `test`.`p`.`id`)))) |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)


 
Requete 2 :
 

| Note  | 1276 | Field or reference 'p.id' of SELECT #2 was resolved in SELECT #1                                                                                                                                                                                                                                                                                                                                                                                                             |
| Note  | 1003 | select `test`.`a`.`id` AS `id`,`test`.`a`.`nom` AS `nom`,`test`.`a`.`adresse` AS `adresse`,`test`.`p`.`id` AS `id`,`test`.`p`.`datetime` AS `datetime`,`test`.`p`.`prix` AS `prix` from `test`.`Adresses` `a` join `test`.`Prix` `p` where ((`test`.`p`.`id` = `test`.`a`.`id`) and (`test`.`p`.`datetime` = (select `test`.`p1`.`datetime` AS `datetime` from `test`.`Prix` `p1` where (`test`.`p1`.`id` = `test`.`p`.`id`) order by `test`.`p1`.`datetime` desc limit 1))) |


 
Requète 3 :
 

| Note  | 1003 | select `test`.`Adresses`.`id` AS `id`,`test`.`Adresses`.`nom` AS `nom`,`test`.`Adresses`.`adresse` AS `adresse`,`test`.`Prix`.`prix` AS `prix` from `test`.`Adresses` join `test`.`Prix` where ((`test`.`Prix`.`id` = `test`.`Adresses`.`id`) and <in_optimizer>((`test`.`Adresses`.`id`,`test`.`Prix`.`datetime`),<exists>(select `test`.`Prix`.`id` AS `id`,max(`test`.`Prix`.`datetime`) AS `dt_max` from `test`.`Prix` group by `test`.`Prix`.`id` having (((<cache>(`test`.`Prix`.`id`) = `test`.`Prix`.`id`) or isnull(`test`.`Prix`.`id`)) and ((<cache>(`test`.`Prix`.`datetime`) = max(`test`.`Prix`.`datetime`)) or isnull(max(`test`.`Prix`.`datetime`))) and <is_not_null_test>(`test`.`Prix`.`id`) and <is_not_null_test>(max(`test`.`Prix`.`datetime`)))))) |


 
J'ai été mauvaise langue, y a que la 3 qui est réécrite en type EXISTS

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
export de phpmyadmin vers SQL Serverordonner les resultats d'une requete SQL !
[SQL] Sauvegarder un fichier dans un blob ?Pb de PL SQL
PROMPT dans une procédure PL SQLHibernate Commande SQL direct
SQl\excelImport Export de données dans une BDD SQL et fichier texte
SQL Server 2005 Express et Full-text index ?[SQL Server]Reporting Services : Pages blanches à l'export des reports
Plus de sujets relatifs à : [SQL] un coup de main pour rouler mon join?


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