J'ai deux demandes que je suis en train de syndiquer et j'aimerais les commander. Je voudrais les commander sur le deuxième élément, la date. Mes questions ressemblent à ceci:
$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);
En lisant les instructions de [ https://docs.joomla.org/Using_the_union_methods_in_database_queries] , je pense que je veux poser la requête après la déclaration d'union. Donc, les deux dernières lignes de ma deuxième requête pourraient ressembler à ceci:
->union ($query2)
->order($db->quote(date) . ' DESC');
Mais je ne pense pas avoir la bonne syntaxe car des erreurs telles que - 1221 - Utilisation incorrecte de UNION et ORDER BY, etc.
Quelle serait la bonne façon de commander ce syndicat s'il vous plaît?
Il n'est actuellement pas possible d'appliquer des fonctions définies telles que les requêtes ORDER BY, HAVING ou GROUP BY to UNION, voir https://github.com/joomla/joomla-cms/issues/6789 .
Mais vous pouvez construire votre requête un peu différemment et cela devrait fonctionner. Essayez quelque chose comme
$query3 = $db->getQuery(true)
->select('a.*')
->from('(' . $query->union($query2) . ') a')
->order('date DESC');
Voir cette réponse sur stackoverflow pour un autre exemple: https://stackoverflow.com/a/3531301/182316
Exemple complet avec 3 requêtes unies:
$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();
Je viens juste de regarder votre clause order
. Je vois une erreur. Vous avez oublié de mettre la valeur sur des guillemets. Essayez de le changer pour:
->order($db->quote('date') . ' DESC');
Si cela ne fonctionne pas, essayez de retirer le . 'DESC'
, donc vous vous retrouvez avec
->order($db->quote('date'));
En dernier recours, essayez d’ajouter un nom de colonne au jeu de résultats comme suit:
->order($db->quote('date'), $db->quoteName('a.event'));
La réponse de Fruppel est parfaite.
Je suis tombé sur un léger piège qui pourrait aider les autres. Si vous aliasez des colonnes à partir de tables différentes de sorte que l'union entière expose le même nom lorsque le nom de colonne de la table d'origine est différent d'une table à l'autre, vous devez vous assurer que la liste des alias est dans le même ordre dans les deux (ou toutes) requêtes interrogées. former l'union.