Pregunta

Estoy teniendo una mesa en la que hay una columna en la que diversos valores son stored.i desea recuperar valores únicos de esa tabla usando DQL.

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

Ahora quiero sólo valores únicos. Alguien puede decirme cómo hacerlo ...

Editar

Estructura de la tabla:

CREATE TABLE IF NOT EXISTS `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `school` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16334 ;

Esta es la consulta que estoy utilizando:

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

Generting SQL para esto me da:

SELECT DISTINCT r.id AS r__id, r.city AS r__city FROM records r WHERE r.state = 'AR'

Ahora comprobamos si el SQL generado ::::    DISTINCT está en la columna 'id' en tanto que quiero distintos en la columna de la ciudad. Alguien sabe cómo solucionar este problema.

Edit2

ID es única causa de su auto un incremento value.Ya Tengo algunos duplicados reales en la columna ciudad como: Delhi y Nueva Delhi. Derecho .. Ahora, cuando estoy tratando de obtener los datos de ella, estoy consiguiendo Delhi dos veces. ¿Cómo puedo hacer consulta como la siguiente:

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

Porque esto me dará la salida correcta.

Edit3:

Alguien que me pueda decir cómo averiguar esta consulta .. ???

¿Fue útil?

Solución

depende de la versión que está utilizando, pero yo tenía el mismo problema y -.> Distinta () trabajado para mí

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

Otros consejos

¿Podría utilizar un GROUP BY?

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

No hay necesidad de RawSql
En lugar de -> seleccionar ( 'rec.city DISTINCT)
Uso -> seleccionar ( 'DISTINCT (rec.city) como la ciudad')

DISTINCT es una función de agregación. Como tal doctrina no puede hidratar su resultado en objetos. Utilice una estrategia de hidratación diferente, como ha sugerido Bartman.

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

funcionó bien para mí

La razón Doctrina siempre está agregando la clave principal para los campos de la lista se encuentra dentro de la hidratación. Cuando Doctrina captan filas de la base de datos se hidrata (= conversos) ellos en una jerarquía de objetos y las referencias del modelo de objetos usando la clave principal. En su caso, este comportamiento no es deseado, ya que sólo los nombres de las ciudades son de interés.

Sugiero dos soluciones, lamentablemente no puedo ponerlos a prueba en este momento.

  1. Doctrine_RawSql . RawSql tiene un manejo especial para consultas distintas.

$q = Doctrine_RawSql::create()
->select('DISTINCT {rec.city}')
->from('Records rec')
->where('rec.state = ?', $state) ->addComponent('rec', 'Record');

$cities = $q->execute()

  1. Use un no-objeto de jerarquía basada Hidratante. Esto podría mantener Doctrina de ir a buscar el campo de clave principal para inicializar la clase del modelo. Consulte la documentación (no se puede enviar el enlace -.. Nuevo usuario lo siento). Para obtener más información

$q = Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->where("rec.state = ?", $state);

$cities = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR);

$ ciudades debe contener una matriz de matrices con teclas como 'rec_city'.

Tenga en cuenta el uso del marcador de posición en el ? donde las declaraciones, es una buena práctica para dejar escapar la Doctrina hacer y no lucha contra sí mismo.

$query = $this->getEntityManager()->createQueryBuilder()
                    ->select('DISTINCT(p.document)')
                    ->from('Products', 'p');

Esta funciona para mí.

Re-contestó

A cuadros esto en mi computadora local - no funcionó. Así que me deje consejos para usar DOP hasta que esto se verá reforzada o fijo:

$dbh = Doctrine_Manager::connection()->getDbh();
$stmt = $dbh->prepare('SELECT DISTINCT(rec.city) FROM <tablename> WHERE rec.state = :state');
$stmt->bindParam(':state', $state);
$stmt->execute();
$result = $stmt->fetchAll();

Consejo
Me gustaría recomendar que use referenciado a la lista de ciudades en la columna city en lugar de llanura de texto para mayor flexibilidad y un mejor rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top