Lehre Sie, wie zu schreiben, Wobei() mit einem sql-Abfrage in
ich habe folgende Abfrage in SQL
... where group_id IN (select group_id from alert where monitor_id = 4);
Ich schreiben wollen, es in der Lehre aber ich weiß nicht, wie Sie die IN der select-into-WOBEI () - Klausel !
irgendeine Idee ?
dies ist, was ich getan habe
$q = $this->createQuery('u')
->select('u.email_address')
->distinct(true)
//->from('sf_guard_user u')
->innerJoin('u.sfGuardUserGroup ug')
->where('ug.group_id IN(select group_id from alert where monitor_id=?',$monitor);
$q->execute();
In der sfGuardUserTable.class:
public function getMailsByMonitor($monitor) {
$q = Doctrine_Query::create()->from("alert a")->where("a.monitor_id", $monitor);
$groups_raw = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
$groups = array();
print_r($groups_raw);
foreach ($groups_raw as $gr) {
$groups[] = $gr->id; //line 33
}
$q2 = $this->createQuery('u')
->select('u.email_address')
->distinct(true)
->innerJoin('u.sfGuardUserGroup ug')
->whereIn("ug.group_id", $groups);
return $q2->execute();
}
- nicht im Zusammenhang mit der eigentlichen Frage aber, um die Nutzung dieser Abfrage: Welches RDBMS verwendest du?
- Verwenden Sie Symfony-1.4 mit Doctrine 1.2 oder sind Sie mit Symfony2 mit doctrine2? (verwirrend-tags)
- Symfony-1.4 mit Doctrine 1.2
- ich benutze mySQL....
- Sind, dass
// before
->aus('sf_guard_user u')` relevant? - Betrachten Sie nach dem umschreiben des die Abfrage mit
JOIN
oder noch besser mitWHERE EXISTS
als mitIN
. MySQL ist Ausführungsplan fürx IN (SELECT y FROM z)
ist bekanntlich nicht optimal. Es ist nicht sehr schlimm, wenn Ihre Tabellen sind kleiner (in Anzahl der Datensätze), aber wenn Sie groß sind, werden Sie bemerken den Unterschied in der Geschwindigkeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise würden Sie so etwas tun:
Aber ich denke, das besser zu Ihren Bedürfnissen passt:
Eine mögliche Lösung - Holen
select group_id from alert where monitor_id = 4
in ein array und verwenden Sie es inwhereIn
Zwei Abfragen statt einer, aber auf jeden Fall den trick tun.
whereIn
im zweiten Abfrage das Ergebnis.HYDRATE_ARRAY
zuHYDRATE_OBJECT
oder$gr->id
zu$gr['id']
.Group
Tabelle index-Spalte mit dem Namengroup_id
🙂$gr->id
mit$gr->group_id