11
votes

Comment obtenir des valeurs uniques à partir de la table de données à l'aide de DQL?

J'ai une table dans laquelle il y a une colonne dans laquelle différentes valeurs sont stockées. Je veux récupérer des valeurs uniques de cette table à l'aide de DQL. xxx pré>

maintenant je ne veux que des valeurs uniques. Quelqu'un peut-il me dire comment faire ça ... p>

Modifier strud> p>

Structure de table: p>

  select DISTINCT rec.city where state="xyz";


3 commentaires

Essayez de changer SELECT ('IMG. *') TO SELECT ('IMG distinct. *')


distinct s'applique à toutes les colonnes que vous sélectionnez. Iow Sélectionnez Distinct A, B, C peut être vu comme Sélectionnez Distinct (A, B, C) . Est-ce un problème pour vous? Avez-vous des duplicités dans Rec.City ? Sont-ils de vrais-couplicités? (Le nom de la ville ferait une clé terrible, ils ne sont pas uniques en aucun cas.)


@ juste quelqu'un vérifier le texte sous Edition2


9 Réponses :


0
votes

Réponse à nouveau :

vérifié cela sur mon ordinateur local - n'a pas fonctionné. Alors laissez-moi vous conseiller d'utiliser PDO jusqu'à ce que cela soit amélioré ou corrigé: xxx

Conseil
Je vous recommanderais d'utiliser Key étranger référencé à la liste des villes sur City < / code> colonne au lieu d'un texte brut pour la flexibilité et une meilleure performance.


2 commentaires

Sélectionnez Distinct R.ID comme R__ID, R.School comme R__School d'enregistrements R.City =? Ceci est le SQL généré par la requête. Mais vérifiez l'emplacement de mot clé distinct. c'est pour la colonne ID non pour la colonne de l'école. Vérifiez la partie d'édition dans la question. Merci


mec ce n'est pas la solution. Je ne suis pas capable de comprendre pourquoi l'enfer cette requête ne peut pas être compris .. ???



1
votes

La doctrine de la raison est toujours en train d'ajouter la clé primaire à la liste des champs réside dans l'hydratation. Lorsque la doctrine récupère des lignes de la base de données, elle hydrate (= convertit) dans une hiérarchie d'objet et références les objets de modèle à l'aide de la clé primaire. Dans votre cas, ce comportement n'a pas été recherché, car les noms de la ville sont intéressants.

Je suggère deux solutions, malheureusement je ne peux pas les tester maintenant.

  1. Essayez d'utiliser doctrine_rawsql . RAWSQL possède une manipulation spéciale pour des requêtes distinctes.

    $ q = doctrine_rawsql :: créer ()
    -> Sélectionnez ("Distinct {Rec.City} ')
    -> de ('Records rec')
    -> où ('rec.state =?', $ État) -> AddComponent ('Rec', 'record');

    $ vities = $ q-> exécuter ()

    1. Utilisez une hydratante basée sur la hiérarchie non-objet. Cela pourrait conserver la doctrine d'aller chercher le champ principal principal pour initialiser la classe de modèle. Voir la documentation (Impossible de poster le lien - Nouvel utilisateur. Désolé.) Pour plus d'informations.

      $ q = doctrine_query :: créer ()
      -> Sélectionnez ("Distinct Rec.City")
      -> de ('Records rec')
      -> où ("rec.state =?", $ État);

      $ vities = $ q-> exécuté (tableau (), doctrine_core :: hydrate_scalar);

      $ Les villes doivent contenir une gamme de tableaux avec des clés telles que "REC_CITY".

      Veuillez noter l'utilisation du ? espace réservé dans l'endroit où des déclarations, c'est une bonne pratique de laisser la doctrine faire l'échappement et ne pas lutter avec lui vous-même.


0 commentaires

2
votes

Vous pouvez utiliser le Raw_SQL classe pour y accomplir. Voici un test que je viens de faire sur ma propre base de données: xxx


0 commentaires

2
votes

distinct est une fonction d'agrégation. Comme cette doctrine ne peut pas hydrater votre résultat dans des objets. Utilisez une stratégie d'hydratation différente, comme Bartman l'a suggéré.

$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->execute(array(), Doctrine_Core::HYDRATE_SCALAR);


0 commentaires

3
votes

Il n'y a pas besoin de RawSQL
À la place de -> Sélectionnez ("Distinct Rec.City")
UTILISATION -> Sélectionnez ("Distinct (Rec.City) en tant que ville ')


1 commentaires

ITA Les crochets autour du RECLITY qui se débarrassent de l'ID. Sans elle, la doctrine apporte une carte d'identité et de la ville et ce n'est pas distinct. Ta. Sauvez-moi créer une autre table.



5
votes

Pourriez-vous utiliser un groupe par? XXX


0 commentaires

17
votes

dépend de la version que vous utilisez, mais j'avais le même problème et -> distinct () a fonctionné pour moi.

Doctrine_Query::create()
      ->select('rec.city')->distinct()
      ->from('Records rec')                   
      ->where("rec.state = '$state'")                                    
       ->execute();     


1 commentaires

S'il vous plaît, n'utilisez jamais des paramètres de requête non évaluée comme -> où ("rec.state = '$ state'") sauf si vous voulez que votre Web piraté vraiment facilement (Injection SQL). Utilisez plutôt des paramètres sûrs: `-> où ('rec.state =: état') -> SetParameter ('' State ', $ State)`



1
votes
$query = $this->getEntityManager()->createQueryBuilder()
                    ->select('DISTINCT(p.document)')
                    ->from('Products', 'p');
This one works for me.

0 commentaires

0
votes

Si vous souhaitez utiliser une requête de doctrine dans un référentiel, les suivants ont fonctionné pour moi:

Remarque: J'utilise Oracle 11g, mais cette même requête doit fonctionner sur MySQL. P>

    $sql =
      "
      SELECT 
        DISTINCT d.fieldname 
        
      FROM 
        Oracle:Dmessage d
      "
    ;
    $query = $this->getEntityManager()->createQuery($sql);
    $results = $query->getResult();


0 commentaires