sql >> データベース >  >> RDS >> Mysql

CakePHPのGROUPとCOUNT()の年齢

    得られる結果は、CakePHPが生成するものとほぼ同じです。

    これを単純化するには、 Set ::combine> アレイのインデックスを再作成します。

    $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');を呼び出す必要があります。

    これにより、年齢をインデックスとしてカウントし、値としてカウントする配列が返されます。

    Array
    (
        [9] => Array
            (
                [COUNT(id)] => 1
    
            )
    
        [10] => Array
            (
                [COUNT(id)] => 1
    
            )
        ...
    )
    

    配列に深みがある理由は、計算フィールドを使用していない場合、cakeがモデルを内部配列のキーとして使用するため、複数のモデルをフィールドとして入力すると、それらが異なる配列に分割されるためです。計算フィールドを使用すると、同じ構造が維持されますが、モデルがわからないため、一般的な配列に配置する必要があります。

    したがって、男性/女性でもグループ化する必要があり、計算フィールドではないUser.sexフィールドがあるとします。

    $data = $this->User->find('all', array(
        'fields' => array(
            "User.sex"
            "DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
            'COUNT(User.id) AS [count]' // n.b. you have to give aliases normally
        ),
        'group' => 'age', 'User.sex'
    ));
    

    これは(次のような)戻ります:

    Array
    (
        [0] => Array
            (
                [User] => Array
                    (
                        [sex] => Male
                    )
                [0] => Array
                    (
                        [age] => 4
                        [count] => 1
                    )
    
            )
    
        [1] => Array
            (
                [User] => Array
                    (
                        [sex] => Female
                    )
                [0] => Array
                    (
                        [age] => 10
                        [count] => 1
                    )
    
            )
    
        [2] => Array
            (
                [User] => Array
                    (
                        [sex] => Male
                    )
                [0] => Array
                    (
                        [age] => 10
                        [count] => 1
                    )
    
            )
    )
    

    したがって、一貫性を保つために、計算フィールドのみを使用する場合でも、余分な深さは常に存在します



    1. MySQLクエリからn番目のレコードを返す

    2. 1GOSQLファイルのインポート=>23行目のエラー2013(HY000):クエリ中にMySQLサーバーへの接続が失われました

    3. ユーザー生成のSQL正規表現でのSQLインジェクションの回避

    4. MySQLの低速クエリログを有効にするにはどうすればよいですか?