Pour les crack en sql ...

Pour les crack en sql ... - SQL/NoSQL - Programmation

Marsh Posté le 12-07-2004 à 19:17:00    

salut !
 
voila j'ai trois tables :
 
mes etablisssement : etb avec comme clé : idetb
mes type d'etablissement : typeetb avec comme clé : idtypeetb
mes type d'etablissement par etablissement (un etablissement peut avoir plusieurs types)  
avec comme clé idetbtypeetb.
 
donc mes tables(colonne1,colonnen)
 
etb (idetb,...)
typeetb (idtypeetb,libtypeetb)
etbtypeetb (idetbtypeetb,idetb,idtypeetb)
 
je recherche les types d'etablissement que NE possede PAS un etablissement donné...
sachant que c'est en mysql et que mysql n'accepte pas les select .... not in (select...)


Message édité par manofjah le 12-07-2004 à 19:20:28
Reply

Marsh Posté le 12-07-2004 à 19:17:00   

Reply

Marsh Posté le 12-07-2004 à 21:25:42    

Pas testé:
 
SELECT
  libtypeetb
FROM
  typeetb,
  etb INNER JOIN etbtypeetb
  ON (etb.idetb = etbtypeetb.idetb)
WHERE
  etb.idetb = variable
  AND libtypeetb NOT IN idtypeetb
;
 
Par contre, ta clé idetbtypeetb n'a visiblement aucun intérêt dans ton modèle.


Message édité par gizmo le 12-07-2004 à 21:42:29
Reply

Marsh Posté le 12-07-2004 à 21:39:57    

gizmo a écrit :

Pas testé:
 
SELECT
  libtypeetb
FROM
  typeetb,
  etb INNER JOIN etbtypeetb
  ON (etb.idetb = etbtypeetb.idtypeetb)
WHERE
  etb.idetb = variable
  AND libtypeetb NOT IN idtypeetb
;
 
Par contre, ta clé idetbtypeetb n'a visiblement aucun intérêt dans ton modèle.


 
 
je connais pas l'operateur on ...
mais tu joint l'identifiant etablissement avec l'id type etablissement ?
et "AND libtypeetb NOT IN idtypeetb" me parait suspect ...
 

Reply

Marsh Posté le 12-07-2004 à 21:43:28    

effectivement, j'ai fais la jointure sur le mauvais champs (faut dire que tu as cherché a faire des noms particulièrement imbitable)
 
EDIT: J'ai corrigé maintenant.


Message édité par gizmo le 12-07-2004 à 21:43:46
Reply

Marsh Posté le 12-07-2004 à 21:45:57    

gizmo a écrit :

effectivement, j'ai fais la jointure sur le mauvais champs (faut dire que tu as cherché a faire des noms particulièrement imbitable)
 
EDIT: J'ai corrigé maintenant.


 
 
bin je les trouves pas mal moi mes noms  :na:.
ils sont d'une logique imparable en plus je peut generer dysnamiquement mes requetes en fonction du nom de la table vu que c'est hyper extra top normalisé mes nom ...
 
bon a part ca merci du coup de main, :)  je vais tester ....
 

Reply

Marsh Posté le 12-07-2004 à 21:48:43    

SELECT libtypeetb
FROM typeetb, etb
INNER JOIN etbtypeetb ON ( etb.idetb = etbtypeetb.idetb )  
WHERE etb.idetb = 12 AND libtypeetb NOT  
IN idtypeetb
LIMIT 0 , 30  
 
MySQL a répondu:
 
 
#1064 - Erreur de syntaxe près de 'idtypeetb LIMIT 0, 30' à la ligne 5
 
 
 
manifestement il aime pas ton libtypeetb NOT  
IN idtypeetb
je comprend pas d'ailleurs ...

Reply

Marsh Posté le 12-07-2004 à 21:52:43    

C'était un essai san garantie [:spamafote] J'espérais que comme ils n'acceptaient pas les subselect qu'ils auraient implémenté un mécanisme permettant de faire une pirouette et profiter de la jointure sans condition avec typeetb.

Reply

Marsh Posté le 12-07-2004 à 21:53:46    

idée: remplace le NOT IN par <>
 
EDIT: à moins que ce ne soit != dans MySQL


Message édité par gizmo le 12-07-2004 à 21:54:13
Reply

Marsh Posté le 12-07-2004 à 22:46:16    

mais pourquoi tu cherche a comparer un lib a un id  ?

Reply

Marsh Posté le 13-07-2004 à 00:02:49    

Et merde, fais chier avec tes noms à la con!
 
SELECT
  type.id
FROM
  type,
  etablissement INNER JOIN type_etablissement
  ON (etablissement.id = type_etablissement.etablissement_refid)
WHERE
  etablissement.id = variable
  AND type_etablissement.type_refid <> type.id
 
Tu feras tes remplacements de nom à la mords-moi-le-noeud toi-même.

Reply

Marsh Posté le 13-07-2004 à 00:02:49   

Reply

Marsh Posté le 13-07-2004 à 00:11:20    

gizmo a écrit :

idée: remplace le NOT IN par <>
 
EDIT: à moins que ce ne soit != dans MySQL


 
http://dev.mysql.com/doc/mysql/fr/ [...] lects.html


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 13-07-2004 à 00:12:42    


Et? S'il ne veut pas sous requètes c'est qu'il a une version trop ancienne. Je ne vois donc pas le rapport avec la choucroute.

Reply

Marsh Posté le 13-07-2004 à 00:18:43    

la version 4.1 est stable depuis quelques mois seulement. je pense que certains hébergeur ne sont pas encore à jour.
 
s'il y a une ancienne version stable installé (p.ex. 4.0.15), il doit utiliser cette syntaxe.
 
je vois pas le rapport avec la bouffe allemande dans ton poste
 
a+


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 13-07-2004 à 00:20:47    

la plupart des hébergeurs sont encore en 3.23, alors la 4.1...

Reply

Marsh Posté le 13-07-2004 à 00:21:51    

justement. raison pour laquelle les NOT IN c'est pas pour demain [:spamafote]


Message édité par jagstang le 13-07-2004 à 00:22:03

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 13-07-2004 à 11:51:52    

Pour revenir sur la remarque de gizmo ...
la clé idetbtypeetb de la table type d'etablissement par etablissement est contraire au formalisme d'un MCD tout simplement parceque la clef de ta table doit etre (idetb,idtypeetb) ... maintenant tu peux tres bien ne pas respecter le formalisme d'un MCD pour des questions de performance!

Reply

Marsh Posté le 19-07-2004 à 14:06:27    

il faut faire un outer join, et une comparaison à NULL en général pour ce genre de requête en mySql 3.X ;)

Reply

Marsh Posté le 19-07-2004 à 16:12:51    

+1 :)
 
Et pas besoin de la table etb dans la requête :
 

SELECT
 typeetb.libtypeetb,
 typeetb.idtypeetb,
 etbtypeetb.idetb
FROM
 typeetb LEFT JOIN etbtypeetb
  ON
  (
   typeetb.idtypeetb = etbtypeetb.idtypeetb
   AND etbtypeetb.idetb = 12
  )
WHERE
 etbtypeetb.idetb IS NULL


 
LEFT JOIN, ça veux dire que je veux tous les enregs de la table typeetb, même s'il n'y a pas de correspondance dans la table etbtypeetb pour l'établissement d'id 12.
 
Pour les enregistrements manquants, la valeur des champs sera NULL.
 
Il suffit donc de sélectionner ceux là !
 
Testé et approuvé par Moi-Même sur Mysql 3.23.47


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 19-07-2004 à 16:19:16    

gizmo a écrit :

Et merde, fais chier avec tes noms à la con!
 
SELECT
  type.id
FROM
  type,
  etablissement INNER JOIN type_etablissement
  ON (etablissement.id = type_etablissement.etablissement_refid)
WHERE
  etablissement.id = variable
  AND type_etablissement.type_refid <> type.id
 
Tu feras tes remplacements de nom à la mords-moi-le-noeud toi-même.


 
:pt1cable: gizmo, tu me déçois de plus en plus :o


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Sujets relatifs:

Leave a Replay

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