IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Requetes SQL imbriquées


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut Requetes SQL imbriquées
    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

  2. #2
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    bonjour

    nouvelle version du problème après avoir vu que la requete SQL pouvait encore être largement améliorée :

    requête de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 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_event
    JOIN avl_vehicle ON (avl_event.VEHICLE_ID=avl_vehicle.ID)
    WHERE avl_event.VALIDITY=1
      AND avl_event.CREATED_AT>'2009-12-29 17:04:54'
      AND avl_event.EVENT_TYPE_ID IN (2,3,6,7,9,10,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,29,32,33,34,37,38,44,45,46,47,52,58,59,65,80,81)
      AND avl_vehicle.COMPANY_ID=6
    ORDER BY avl_event.CREATED_AT DESC
    LIMIT 6
    Requête cible :
    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
     
    SELECT *
    FROM
    (
      SELECT 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_event
      WHERE avl_event.VALIDITY=1
        AND avl_event.CREATED_AT>'2009-12-29 17:04:54'
        AND avl_event.EVENT_TYPE_ID IN (2,3,6,7,9,10,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,29,32,33,34,37,38,44,45,46,47,52,58,59,65,80,81)
      ORDER BY avl_event.CREATED_AT DESC
      LIMIT 6
    ) as event
    JOIN avl_vehicle
      ON event.VEHICLE_ID=avl_vehicle.ID
    WHERE avl_vehicle.COMPANY_ID=6
    Est ce que quelqu'un saurait faire ce genre de requêtes ?

    Merci

    Pierre

Discussions similaires

  1. requete SQL (imbriqué?)
    Par leame dans le forum Langage SQL
    Réponses: 9
    Dernier message: 02/07/2010, 14h21
  2. requete sql imbriquée
    Par Ludo75 dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2008, 12h06
  3. Requetes SQL imbriquées
    Par olibara dans le forum Requêtes
    Réponses: 0
    Dernier message: 25/02/2008, 20h34
  4. requetes sql imbriquées
    Par lesaint972 dans le forum Accès aux données
    Réponses: 5
    Dernier message: 28/08/2007, 16h54
  5. Requete Sql imbriqué
    Par NeHuS dans le forum ASP
    Réponses: 11
    Dernier message: 01/06/2006, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo