Bonjour

J'essaye d'optimiser une requête SQL créée par symfony.

Voici cette requête :
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
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
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
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.

Je suis toujours bloqué a ce niveau de code :
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;
Est ce que vous auriez un exemple de requête imbriquée qui pourrait m'aider ? ou un conseil ?

Merci

Pierre