it-swarm.com.de

UNION bestellen

Ich habe zwei Anfragen, die ich zusammenführe und die ich bestellen möchte. Ich möchte sie auf dem zweiten Element, dem Datum, bestellen. Meine Fragen sehen so aus:

$query2
    ->select ($db->quoteName(array('c.event','b.date','b.type','d.name')))
    ->from ($db->quoteName('app_mob_animal', 'a'))
    ->join('INNER', $db->quoteName('app_event_animal', 'b') . 'ON (' .$db->quoteName('a.mob'). '=' .$db->quoteName('b.mob').')')    
    ->join('INNER', $db->quoteName('app_events', 'c') . 'ON (' .$db->quoteName('b.event'). '=' .$db->quoteName('c.id').')') 
    ->join('INNER', $db->quoteName('app_mob', 'd') . 'ON (' .$db->quoteName('a.mob'). '=' .$db->quoteName('d.id').')')
    ->where (($db->quoteName('a.animal') . 'LIKE' . $db->quote($anid)), 'AND')
    ->where (($db->quoteName('a.joined') . '<=' . $db->quoteName('b.date')), 'AND') 
    ->where ('('.$db->quoteName('a.left') . '>=' . $db->quoteName('b.date') .' OR '. $db->quoteName('a.left') .' LIKE '. $db->quote($emptyDate).')');

$query
    ->select ($db->quoteName(array('b.event','a.date','a.type','b.id')))
    ->from ($db->quoteName('app_event_animal', 'a'))
    ->join('INNER', $db->quoteName('app_events', 'b') . 'ON (' .$db->quoteName('a.event'). '=' .$db->quoteName('b.id').')')     
    ->where ($db->quoteName('a.animal') . 'LIKE' . $db->quote($anid))
    ->union ($query2);  

Nach dem Lesen der Anweisungen unter [ https://docs.joomla.org/Using_the_union_methods_in_database_queries] möchte ich die Abfrage nach der union-Anweisung einfügen. Die letzten beiden Zeilen meiner zweiten Abfrage könnten also so aussehen:

->union ($query2)
->order($db->quote(date) . ' DESC');    

Aber ich glaube nicht, dass ich die richtige Syntax habe, da ich immer wieder Fehler erhalte wie - 1221 - Falsche Verwendung von UNION und ORDER BY usw.

Was wäre der richtige Weg, um diese Union bitte zu bestellen?

2
Hannah Smith

Es ist derzeit nicht möglich, festgelegte Funktionen wie ORDER BY, HAVING oder GROUP BY auf UNION-Abfragen anzuwenden, siehe https://github.com/joomla/joomla-cms/issues/6789 .

Aber Sie können Ihre Abfrage ein wenig anders erstellen und es sollte funktionieren. Versuchen Sie etwas wie

$query3 = $db->getQuery(true)
              ->select('a.*')
              ->from('(' . $query->union($query2) . ') a')
              ->order('date DESC');

In dieser Antwort zu stackoverflow finden Sie ein weiteres Beispiel: https://stackoverflow.com/a/3531301/182316

Komplettes Beispiel mit 3 gemeinsamen Abfragen:

$db = JFactory::getDbo();
$query1 = $db->getQuery(true)->select('*')->from('#__menu')->where('id = 2');
$query2 = $db->getQuery(true)->select('*')->from('#__menu')->where('id = 3');
$query3 = $db->getQuery(true)->select('*')->from('#__menu')->where('id = 4');

$query = $db->getQuery(true)
             ->select('a.*')
             ->from('(' . $query1->union($query2)->union($query3) . ') a')
             ->order('id DESC');

//echo $query->dump();
$result = $db->setQuery($query)->loadObjectList();
2
fruppel

Ich habe mir nur Ihre order -Klausel angesehen. Ich sehe einen Fehler. Sie haben vergessen, den Wert in Anführungszeichen zu setzen. Versuchen Sie es zu ändern:

->order($db->quote('date') . ' DESC');

Wenn dies nicht funktioniert, entfernen Sie das . 'DESC', also endest du mit

->order($db->quote('date'));

Versuchen Sie als letzte Möglichkeit, dem Resultset einen Spaltennamen wie folgt hinzuzufügen:

->order($db->quote('date'), $db->quoteName('a.event'));
0
Lodder

Die Antwort von Fruppel ist genau richtig.

Es gibt ein kleines Problem, das mir begegnet ist und das anderen helfen könnte. Wenn Sie Spalten aus verschiedenen Tabellen als Alias ​​verwenden, sodass die gesamte Union denselben Namen aufweist, wobei der ursprüngliche Tabellenspaltenname zwischen den Tabellen unterschiedlich ist, müssen Sie sicherstellen, dass die Aliasliste in beiden (oder allen) Abfragen in derselben Reihenfolge vorliegt die Gewerkschaft bilden.

0
mhall