كيف يمكن الحصول على قيم فريدة من جدول البيانات باستخدام DQL؟

StackOverflow https://stackoverflow.com/questions/2148620

  •  23-09-2019
  •  | 
  •  

سؤال

لدي جدول يوجد فيه عمود يتم فيه تخزين القيم المختلفة. أريد استرداد القيم الفريدة من هذا الجدول باستخدام 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();                 

توليد SQL لهذا يعطيني:

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

الآن تحقق من SQL التي تم إنشاؤها :::: خامد هو على عمود "ID" حيث أريد متميزًا على عمود المدينة. هل يعلم أحد كيف يصلح هذا.

EDIT2

المعرف فريد من نوعه لأنه قيمة تدريجية تلقائية. لدي بعض التكرارات الحقيقية في عمود المدينة مثل: دلهي ودلهي. على حق .. الآن عندما أحاول جلب البيانات منها ، أحصل على دلهي مرتين. كيف يمكنني جعل الاستعلام مثل هذا:

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

لأن هذا سوف يعطيني الإخراج المناسب.

EDIT3:

أي شخص يمكن أن يخبرني كيف يكتشف هذا الاستعلام .. ؟؟؟

هل كانت مفيدة؟

المحلول

يعتمد على الإصدار الذي تستخدمه ، لكن كان لدي نفس المشكلة و -> متميز () عملت بالنسبة لي.

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

نصائح أخرى

هل يمكنك استخدام مجموعة من قبل؟

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

ليست هناك حاجة في RAWSQL
بدلاً من -> حدد ('recity recity')
استخدم -> SELECT ('متميز (Rec.City) كمدينة)

يمكنك استعمال ال 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";
}

?>

متميزة هي وظيفة التجميع. لأن هذا العقيدة لا يمكن ترطيب النتيجة إلى كائنات. استخدم استراتيجية ترطيب مختلفة ، كما اقترح بارتمان.

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

عملت بشكل جيد بالنسبة لي

العقيدة السبب هو دائمًا إضافة المفتاح الأساسي إلى قائمة الحقول الموجود داخل الترطيب. عندما تجلب العقيدة صفوفًا من قاعدة البيانات ، فإنه يرطبها (= يحولها) إلى تسلسل هرمي للكائن ويشير إلى كائنات النموذج باستخدام المفتاح الأساسي. في حالتك ، هذا السلوك غير مطلوب ، لأن أسماء المدينة فقط هي ذات أهمية.

أقترح حلين ، للأسف لا يمكنني اختبارهما الآن.

  1. جرب استخدام عقيدة. RAWSQL لديه معالجة خاصة للاستعلامات المميزة.

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

$cities = $q->execute()

  1. استخدم Herator قائم على التسلسل الهرمي غير الكائن. قد يمنع هذا العقيدة من جلب حقل المفتاح الأساسي لتهيئة فئة النموذج. راجع الوثائق (لا يمكن نشر الرابط - مستخدم جديد. آسف.) لمزيد من المعلومات.

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

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

يجب أن تحتوي المدن $ على مجموعة من المصفوفات مع مفاتيح مثل "rec_city".

يرجى ملاحظة استخدام ? العنصر النائب في حيث العبارات ، من الممارسات الجيدة السماح للعقيدة بالهروب وعدم الصراع معها بنفسك.

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

هذا واحد يعمل بالنسبة لي.

إعادة الإجابة:

فحص هذا على جهاز الكمبيوتر المحلي الخاص بي - لم ينجح. لذلك اسمحوا لي أن ننصح باستخدام 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 العمود بدلاً من النص العادي للمرونة وأداء أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top