[Doctrine] Requête imbriquée dans un FROM

1,014 views
Skip to first unread message

Cyril Flieller

unread,
Aug 24, 2011, 9:37:09 AM8/24/11
to symfo...@googlegroups.com
J'ai un petit souci avec une requête SQL que je dois traduire den DQL. J'ai lu sur un forum qu'il était impossible dans un FROM d'avoir une requête imbriquée car Doctrine n'acceptait que les tables du Modèle, ce qui me semble assez logique, mais j'imagine que l'on peut contourner cela. Voilà ma requête :

SELECT *
FROM operation o
LEFT JOIN (
SELECT *
FROM operation_history
ORDER BY ohdate DESC
) AS oh ON i.id = oh.operation_id
LEFT JOIN user u ON u.id = o.user_id
LEFT JOIN member_group mg ON u.id = mg.user_id
WHERE mg.group_id = 2
GROUP BY o.id
HAVING oh.status_id = 1

J'ai une table opération, une opération étant constituée d'une série de tâches.
Quand on lance l'opération, ou quand on a fini une tache, on stocke des informations dans la table operation_history, un historique des taches de l'opération, avec une date et un statut.

Dans cette requête, je veux avoir chaque opération dont le dernier statut est celui passé en paramètre (ici le statut 1), considérant un groupe d'user d'un groupe passé en paramètre (ici le groupe 2). Donc ma requête imbriquée va classer l'historique des opérations par date, de telle sorte qu'avec le Group By, je ne récupère que la dernière occurrence de l'historique pour chaque opération.

je ne refuse pas un peu d'aide =)

Merci d'avance


Simon Leblanc

unread,
Aug 24, 2011, 12:02:37 PM8/24/11
to symfo...@googlegroups.com
Le 24/08/2011 15:37, Cyril Flieller a �crit :
> J'ai un petit souci avec une requ�te SQL que je dois traduire den DQL.
> J'ai lu sur un forum qu'il �tait impossible dans un FROM d'avoir une
> requ�te imbriqu�e car Doctrine n'acceptait que les tables du Mod�le, ce

> qui me semble assez logique, mais j'imagine que l'on peut contourner
> cela. Voil� ma requ�te :

>
> SELECT *
> FROM operation o
> LEFT JOIN (
> SELECT *
> FROM operation_history
> ORDER BY ohdate DESC
> ) AS oh ON i.id <http://a.id/> = oh.operation_id
> LEFT JOIN user u ON u.id <http://p.id/> = o.user_id
> LEFT JOIN member_group mg ON u.id <http://p.id/> = mg.user_id
> WHERE mg.group_id = 2
> GROUP BY o.id <http://a.id/>
> HAVING oh.status_id = 1
>

Bonjour,


sans trop regarder si tu peux passer par une autre solution, la solution
pour avoir le SELECT dans ton FROM pourrait �tre trouv�e en passant par
une vue normalement.

Tu cr�es une vue SQL avec ta requete "SELECT * FROM operation_history
ORDER BY ohdate DESC" et tu cr�es un mod�le pour ta vue.

Une fois que tu as ton mod�le, tu peux l'utiliser dans ta requ�te
d'origine :


SELECT *
FROM operation o

LEFT JOIN ma_vue AS oh ON i.id = oh.operation_id


LEFT JOIN user u ON u.id = o.user_id
LEFT JOIN member_group mg ON u.id = mg.user_id
WHERE mg.group_id = 2
GROUP BY o.id
HAVING oh.status_id = 1

Cordialement,
Simon Leblanc

Cyril Flieller

unread,
Aug 25, 2011, 9:03:22 AM8/25/11
to symfo...@googlegroups.com
Sachant que cela va servir pour une seul requête, c'est chiant ? En plus c'est la même table, elle est juste triée, n'y a-t-il pas une autre solution.

Cyril FLIELLER




2011/8/24 Simon Leblanc <lebla...@portailpro.net>
Le 24/08/2011 15:37, Cyril Flieller a écrit :
J'ai un petit souci avec une requête SQL que je dois traduire den DQL.
J'ai lu sur un forum qu'il était impossible dans un FROM d'avoir une
requête imbriquée car Doctrine n'acceptait que les tables du Modèle, ce

qui me semble assez logique, mais j'imagine que l'on peut contourner
cela. Voilà ma requête :


SELECT *
FROM operation o
LEFT JOIN (
SELECT *
FROM operation_history
ORDER BY ohdate DESC
) AS oh ON i.id <http://a.id/> = oh.operation_id
LEFT JOIN user u ON u.id <http://p.id/> = o.user_id
LEFT JOIN member_group mg ON u.id <http://p.id/> = mg.user_id

WHERE mg.group_id = 2
GROUP BY o.id <http://a.id/>

HAVING oh.status_id = 1


Bonjour,


sans trop regarder si tu peux passer par une autre solution, la solution pour avoir le SELECT dans ton FROM pourrait être trouvée en passant par une vue normalement.

Tu crées une vue SQL avec ta requete "SELECT * FROM operation_history ORDER BY ohdate DESC" et tu crées un modèle pour ta vue.

Une fois que tu as ton modèle, tu peux l'utiliser dans ta requête d'origine :

SELECT *
FROM operation o
LEFT JOIN ma_vue AS oh ON i.id = oh.operation_id

LEFT JOIN user u ON u.id = o.user_id
LEFT JOIN member_group mg ON u.id = mg.user_id
WHERE mg.group_id = 2
GROUP BY o.id
HAVING oh.status_id = 1



Cordialement,
Simon Leblanc

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Symfony-fr.
Pour envoyer un message à ce groupe, adressez un e-mail à symfo...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse symfony-fr+unsubscribe@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/symfony-fr?hl=fr


Reply all
Reply to author
Forward
0 new messages