1

私の CakePHP モデルでは、テーブルからデータを取得しようとしています。
DISTINCT を使用してみましたが、DISTINCT を使用してもクエリ結果は変わらないようです。同じニックネーム
を持つ多くの行が表示されます

「DISTINCT Mytable.nick」を使用

$this->Mytable->find('all',
    array(
        'fields'=> array(
            'DISTINCT Mytable.nick',
            'Mytable.age', 'Mytable.location',
        ),
        'conditions' => array('Mytable.id >=' => 1, 'Mytable.id <=' => 100),
        'order' => array('Mytable.id DESC')
));

「グループ Mytable.nick」

$this->Mytable->find('all',
    array(
        'fields'=> array(
            'Mytable.nick',
            'Mytable.age', 'Mytable.location',
        ),
        'conditions' => array('Mytable.id >=' => 1, 'Mytable.id <=' => 100),
        'group' => 'Mytable.nick',
        'order' => array('Mytable.id DESC')
));

「Mytable.nick」

$this->Mytable->find('all',
    array(
    'fields'=> array(
            'Mytable.nick',
            'Mytable.age', 'Mytable.location',
    ),
    'conditions' => array('Mytable.id >=' => 1, 'Mytable.id <=' => 100),
    'order' => array('Mytable.id DESC')
));

編集: CakePHP 2.1 でも DISTINCT オプションを使用できないようです。「GROUP BY」を試してみると、問題は解決しました。しかし、私のクエリからわかるように、Mytable.idを降順で並べ替える必要があります。GROUP BY を使用すると、Mysql が関連する行を見つけると、他の行は取得されません。例えば。

  • id=1、ニック=マイク、年齢=38、場所=英国
  • id=2、ニック=アルバート、年齢=60、場所=アメリカ
  • ID=3、ニックネーム=灰、年齢=42、場所=英国
  • id=4、ニック=アルバート、年齢=60、場所=new_zelland

を使用するgroup Mytable.nickと、結果に 4 行目が表示されず、2 行目が表示されます。mysql が "albert" を 2 度目に見たとき、それが結果に含まれていないためです。しかし、最新の "albert" の結果が必要です。それは不可能ですか?

Edit2: コンフリクトによる並べ替え/グループ化はよくある問題のようです。この質問でいくつかのヒントを見つけました。しかし、それはネイティブMysqlクエリの解決策を提供します. CakePHP タイプのクエリのソリューションが必要です。

4

1 に答える 1

0

ニックネームでグループ化し、ID で並べ替える理由が明確ではありません。COUNT()同じニックネームが何回出現するかを確認するような集計関数を使用するつもりですか? つまり、全体的な目標はまだ明確ではありません。HAVINGMySQL キーワードに注意する価値があるかもしれません。

更新: OK、それはより理にかなっています。したがって、条件でサブ選択を使用するか、おそらくそれを結合として表現する必要があります。WHERE 句でサブセレクトを使用した例を示します。

/* select last occurrence for each nick (if you need one for each location )*/
SELECT nick, age, location
FROM myTable t1
WHERE id =
    (SELECT MAX(id) 
    FROM myTable t1
    WHERE t1.nick = t2.nick);

このようなものがうまくいくと思います:

$this->Mytable->find('all',
    array(
    'fields'=> array(
            'Mytable.nick',
            'Mytable.age', 'Mytable.location',
    ),
    'conditions' => array('Mytable.id =' => '(SELECT MAX(id) FROM myTable t2 WHERE myTable.nick = t2.nick)', 'Mytable.id <=' => 100)
));
于 2012-08-27T21:26:31.300 に答える