web-dev-qa-db-ja.com

UNIONの注文

結合しているクエリが2つあり、それらを注文したいと思います。 2番目の要素である日付でそれらを注文したいと思います。私のクエリは次のようになります:

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

[ https://docs.joomla.org/Using_the_union_methods_in_database_queries] の説明を読んで、ユニオンステートメントの後にクエリを配置したいと思います。したがって、2番目のクエリの最後の2行は次のようになります。

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

しかし、私は-1221-UNIONやORDER BYなどの誤った使用法などのエラーが発生し続けるので、構文が正しいとは思いません。

この組合を注文する正しい方法は何ですか?

2
Hannah Smith

現在、ORDER BY、HAVING、GROUP BYなどのセット関数をUNIONクエリに適用することはできません。 https://github.com/joomla/joomla-cms/issues/6789 を参照してください。

しかし、少し異なるクエリを作成することができ、それは機能するはずです。のようなものを試してください

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

別の例については、stackoverflowでこの回答を参照してください: https://stackoverflow.com/a/3531301/182316

3つの統合クエリを使用した完全な例:

$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

order句を見ただけです。私は間違いを見ます。値を引用符で囲むのを忘れました。次のように変更してみてください。

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

これが機能しない場合は、. 'DESC'、それであなたは

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

最後の手段として、次のように結果セットに列名を追加してみてください。

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

フルペルの答えはその場にあります。

他の人を助けるために私が遭遇したちょっとした落とし穴があります。異なるテーブルの列にエイリアスを付けて、ユニオン全体が同じ名前を公開し、元のテーブルの列名がテーブル間で異なる場合は、両方(またはすべて)のクエリでエイリアスリストが同じ順序であることを確認する必要があります。組合を結成する。

0
mhall