[SQL] Variable dans une requete

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 : [SQL] Variable dans une requete

Re: [SQL] Variable dans une requete

par YanD » 21 janv. 2020, 15:48

Merci pour ton aide !
J'avais aussi posé la question sur stackoverflow et une personne a trouvé comment faire.
Je poste sa Query :
SELECT t2.name AS Name, group_concat(t1.name) AS CallsBy
FROM t_operation t1
    LEFT JOIN 
        (SELECT to3.ElementID, to2.name
        FROM t_object to1
            LEFT JOIN t_operation to2 
			    ON to1.Object_ID = to2.Object_ID
            LEFT JOIN t_operationtag to3 
			    ON find_in_set(to2.Name, to3.VALUE)
        WHERE to3.Property = 'Calls'
        AND to1.Object_ID = '1') t2
    ON t1.OperationID = t2.ElementID
	WHERE t2.ElementID IS NOT NULL
GROUP BY t2.name;
https://stackoverflow.com/questions/598 ... a-variable

Re: [SQL] Variable dans une requete

par Spols » 21 janv. 2020, 12:48

voila ce que je ferait
SELECT op1.Name as NomFonction, function_tag.VALUE AS CallsBy
FROM t_object AS myClass 
LEFT JOIN t_operation AS op1 
    ON myClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag 
    ON op1.OperationID = function_tag.ElementID)
WHERE myClass.Object_ID = '1'

Re: [SQL] Variable dans une requete

par YanD » 21 janv. 2020, 12:09

Oui j'ai changer par group by op1.Name.

J'ai fait un sample data :
https://dbfiddle.uk/?rdbms=mysql_8.0&fi ... 82833042ce

On peut voir que la query retourne toute les opérations qui appelle la fonction "class2Operation1".
Ce que j'aimerai pouvoir faire est de sélectionner uniquement la classe et que la query me retourne pour chaque opération de la classe choisie qu'elles sont les opérations qui l'appel.
Ma seule variable que je peux avoir est la suivante : WHERE myClass.Object_ID = '2'
Le résultat serait pour la classe 1 :
Nom fonction | CallsBy
class1Operation1 | class2Operation2, class3Operation1
class1Operation2 | class2Operation3
class1Operation3 | class2Operation3

Pour la classe 2
Nom fonction | CallsBy
class2Operation1 | class1Operation1, class3Operation1, class3Operation3
class2Operation2 | class1Operation1
class2Operation3 | class1Operation1

Pour la classe 3
Nom fonction | CallsBy
class3Operation1 | class1Operation2, class3Operation1
class3Operation2 | class1Operation3
class3Operation3 | class2Operation1

Re: [SQL] Variable dans une requete

par Spols » 21 janv. 2020, 09:27

Sans la structure complète de tes tables impossible d'être précis.

Mais je pense que tu te complique la vie en appelant 2 fois tes tables object et opération je vois pas pourquoi tu pourrais pas utiliser op1.Name

de plus tu devrais passer les conditions de sélection dans ton WHERE et laisser dans tes ON seulement les condition de jointure.

[SQL] Variable dans une requete

par YanDJ » 20 janv. 2020, 17:35

Bonjour,

Je débute en SQL et j'essaie de faire une requête pour trouver tout les appelants de ma fonction, je m'explique :
J'ai 3 tables :
t_object : Contient toutes mes classes.
t_operation : Toutes les opérations (fonctions) de toutes les classes. Elles sont lié entre elles avec : t_object.Object_ID = t_operation.Object_ID
t_operationtag : Contient tous les tag associés aux opérations. Avec le lien : t_operation.OperationID = t_operationtag.ElementID

Pour chaque opération, j'ai un tag associé "Calls" qui me dit qu'elles sont les opérations appelées par elle même:
t_operationtag.Property = 'Calls'
t_operationtag.VALUE ="texte"

Le but est de lister pour chaque opération '1', les opérations '2' qui appelle l'opération '1' (CallsBy). J'ai fait une petite requête qui fonctionne bien mais qui est "static" :
SELECT op1.Name
FROM t_object AS allClass 
LEFT JOIN t_operation AS op1 ON allClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) AND (function_tag.VALUE LIKE CONCAT("%", "MSA_Se_SECU_ComputeHMAC", "%") AND function_tag.Property = 'Calls'))
GROUP BY op1.OperationID
J'aimerai pouvoir faire varier "MSA_Se_SECU_ComputeHMAC" afin de sélectionner une classe et que la requête me retourne tout les "CallsBy" de toutes les fonctions de ma classe.
J'ai tenté de faire ça :
SELECT op1.Name
FROM t_object AS allClass2 LEFT JOIN t_operation AS op2 ON allClass2.Object_ID = op2.Object_ID,
t_object AS allClass 
LEFT JOIN t_operation AS op1 ON allClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) AND (function_tag.VALUE LIKE CONCAT("%",op2.Name, "%") AND function_tag.Property = 'Calls'))
WHERE allClass2.Object_ID = '783'
GROUP BY op1.OperationID
Le problème c'est qu'il ne connait pas op2.Name et je suis un peu a cours d'idée pour faire varier le nom de la fonction.

Est ce que quelqu'un pourrais m'aider ?

Merci