Bonjour
J'essaye d'optimiser une requête SQL créée par symfony.
Voici cette requête :
Et ce que je veux maintenant générer (Celle ci est environ 25 fois plus rapide)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT SQL_NO_CACHE avl_event.ID, avl_event.VEHICLE_ID, avl_event.DRIVER_ID, avl_event.EVENT_TYPE_ID, avl_event.CREATED_AT, avl_event.MESSAGE, avl_event.RECEIVED, avl_event.LONGITUDE, avl_event.QUADRANT_LONG, avl_event.LATITUDE, avl_event.QUADRANT_LAT, avl_event.HEADING, avl_event.SPEED, avl_event.LOCATION_NAME, avl_event.VALIDITY FROM avl_vehicle JOIN avl_event ON avl_vehicle.COMPANY_ID=1 AND avl_vehicle.ID = avl_event.VEHICLE_ID JOIN avl_event_type_group ON avl_event.EVENT_TYPE_ID=avl_event_type_group.EVENT_TYPE_ID WHERE avl_event_type_group.EVENT_GROUP_ID=2 AND avl_event.VALIDITY=1 AND avl_event.CREATED_AT > '2009-08-26 20:45:31' ORDER BY avl_event.CREATED_AT DESC LIMIT 6
Mon problème, c'est que cette solution contient 2 niveau d'imbrication de requêtes, et je ne vois pas du tout comment faire des requêtes imbriquées avec l'aide de criteria.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SELECT * FROM ( SELECT SQL_NO_CACHE avl_event.ID, avl_event.VEHICLE_ID, avl_event.DRIVER_ID, avl_event.EVENT_TYPE_ID, avl_event.CREATED_AT, avl_event.MESSAGE, avl_event.RECEIVED, avl_event.LONGITUDE, avl_event.QUADRANT_LONG, avl_event.LATITUDE, avl_event.QUADRANT_LAT, avl_event.HEADING, avl_event.SPEED, avl_event.LOCATION_NAME, avl_event.VALIDITY FROM avl_vehicle JOIN avl_event ON avl_vehicle.COMPANY_ID=1 AND avl_vehicle.ID = avl_event.VEHICLE_ID WHERE avl_event.VALIDITY=1 AND avl_event.CREATED_AT > '2009-08-26 20:45:31' AND avl_event.event_type_id IN( SELECT SQL_NO_CACHE event_type_id FROM avl_event_type_group WHERE event_group_id = 2 ) ORDER BY avl_event.CREATED_AT DESC ) as temp LIMIT 6
Je suis toujours bloqué a ce niveau de code :
Est ce que vous auriez un exemple de requête imbriquée qui pourrait m'aider ? ou un conseil ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 $c2 = new Criteria(); //$c2->addSelectColumn(EventTypeGroupPeer::EVENT_TYPE_ID); $c2->add(EventTypeGroupPeer::EVENT_GROUP_ID, EventGroupPeer::EVENT_GROUP_LAST_EVENTS_ID, Criteria::EQUAL); $c = new Criteria(); $c->addJoin(self::VEHICLE_ID, VehiclePeer::ID, Criteria::JOIN); $c->addAnd(self::VALIDITY, 1); $c->addAnd(EventPeer::CREATED_AT, time()-60*60*24, Criteria::GREATER_THAN); //$c->add(self::EVENT_TYPE_ID, EventTypeGroupPeer::doSelect($c2), Criteria::IN); $c->addDescendingOrderByColumn(EventPeer::CREATED_AT); if ($limit > 0) { $c->setLimit($limit); } return $c;
Merci
Pierre
Partager