Как может получить уникальные значения из таблицы данных с помощью dql?

У меня есть таблица, в которой существует столбец, в котором различные значения являются stored.i, хотят получить уникальные значения от той таблицы с помощью dql.

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

Теперь я хочу только уникальные значения. Может кто-либо говорить мне, как сделать это...

Править

Структура таблицы:

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 ;

Это - Запрос, который я использую:

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

Generting Sql для этого дает мне:

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

Теперь проверьте, что sql генерировал:::: ОТЛИЧНЫЙ, находится на 'идентификационном' столбце где, как я хочу Отличный на городском столбце. Кто-либо знает, как зафиксировать это.

EDIT2

Идентификатор является уникальной причиной автоматическое возрастающее значение. Ya у меня есть некоторые реальные дубликаты в городском столбце как: Дели и Дели.Правильно.. Теперь, когда я пытаюсь выбрать данные из него, я получаю Дели два раза. Как может я делать запрос как это:

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

Вызовите это даст мне надлежащий вывод.

EDIT3:

Кто-либо, кто может сказать мне, как выяснить этот запрос..???

11
задан Mohit Jain 1 February 2010 в 18:42
поделиться

6 ответов

Повторный ответ:

Проверили это на моем локальном компьютере - не сработало. Поэтому позвольте мне посоветовать использовать PDO до тех пор, пока это не будет улучшено или исправлено:

$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();

Совет
Я бы порекомендовал вам использовать -иностранный ключ со ссылкой на список городов в колонке city вместо простого текста для гибкости и лучшей производительности.

0
ответ дан 3 December 2019 в 03:04
поделиться

Для этого можно использовать класс Raw_Sql . Вот тест, который я только что выполнил для своей собственной базы данных:

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'library');

require('Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

Doctrine::loadModels('application/models/generated');
Doctrine::loadModels('application/models');

$dm=Doctrine_Manager::getInstance();
$conn = $dm->openConnection("mysql://dbuser:dbpass@localhost/database");  //changed actual values...
$q = new Doctrine_RawSql($conn);

$q->select('{c.name}')
   ->distinct()
   ->from('contactlist c')
   ->addComponent('c', 'Contactlist');

//this outputs:  SELECT DISTINCT c.name AS c__name FROM contactlist c
echo $q->getSqlQuery() . "<br>\n"; 

$contacts = $q->execute();
foreach($contacts->toArray() as $contact){
    echo $contact['name'] . "<br>\n";
}

?>
2
ответ дан 3 December 2019 в 03:04
поделиться

Причина доктрины всегда добавляет первичный ключ в список полей, лежит внутри гидратации. Когда доктрина выбирает строки из базы данных, она гидратата (= преобразует) их в иерархию объекта и ссылается на объекты модели с использованием первичного ключа. В вашем случае это поведение не хотелось, так как только имени города представляют интерес.

Я предлагаю два решения, к сожалению, я не могу тестировать их прямо сейчас.

  1. Попробуйте использовать DOCTRINE_RAWSQL . RawsQL имеет специальную обработку для отдельных запросов.

$ q = doctrine_rawsql :: Create ()
-> Выбрать («отлично {REC.city}»)
-> От ('Records Rec')
-> Где ('rec.state =?', $ State) -> AddComponent («REC», «RECORD»);

$ CULTIONS = $ Q-> EXECUTE ()

  1. Используйте гидрата на основе не объектной иерархии. Это может удержать доктрину извлекать поле первичного ключа для инициализации класса модели. Смотрите документацию (не могу опубликовать ссылку - новый пользователь. Извините.) Для получения дополнительной информации.

$ q = ustrine_query :: create ()
-> Выбрать («отчетливый rec.city»)
-> От ('Records Rec')
-> Где («rec.State =?», $ State);

$ Cities = $ Q-> Execute (Array (), Doctrine_Core :: Hydrate_scalar);

$ Города должны содержать массив массивов с Клавиши, такие как «REC_CITY».

Обратите внимание на использование ? Placeholder в заявлениях, где приятная практика, чтобы доктрина отказалась от побега и не борьба с этим самостоятельно.

1
ответ дан 3 December 2019 в 03:04
поделиться

DISTINCT - это функция агрегирования. Таким образом, Doctrine не может преобразовать ваш результат в объекты. Используйте другую стратегию гидратации, как предлагает Бартман.

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

у меня сработало

2
ответ дан 3 December 2019 в 03:04
поделиться

Нет необходимости в RawSql
Вместо -> select ('DISTINCT rec.city')
Используйте -> select ('DISTINCT (rec.city ) as city ')

3
ответ дан 3 December 2019 в 03:04
поделиться

Не могли бы вы использовать GROUP BY?

Doctrine_Query::create()
    ->select('rec.school')
    ->from('Records rec')                   
    ->where("rec.city='$city' ")                                    
    ->groupBy('rec.school')   
    ->execute();
5
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: