2016-07-16 5 views
0

カウントで並べ替えを実行しようとしています。私のDBでUSERS、私は、ユーザーのホーム状態の例を格納状態という名前の列があります:で、その後カウントまたは発生数に基づいて同じmysql列の値を並べ替える方法

public function friends() 
{ 
    return $this->friendsOfMine() 
     ->wherePivot('accepted', true) 
     ->get() 
     ->merge(
      $this->friendsOf() 
       ->wherePivot('accepted', true) 
       ->get() 
     ); 
} 

:フロリダ

私はコレクションにこのような何かを引っ張ってる私がDBいる ビュー:

@foreach ($user->friends() as $friend) 
{{$friend->state}} 
@endforeach 

は、私は(その状態のため、友人の総量)のカウントを順に状態からの友人の状態から、友人の最大量から最小の量を状態をソートして表示したい

例:NEWYORKは100人の友人を持っている場合は、テキサス州は70人の友人を持っており、フロリダ州は20人の友人を持って、その結果は次のようになります。

NEWYORK 100

テキサス70

フロリダ20

I私はcount()、sort()、sortBy()などの関数を使うことができると知っていますが、このケースではどのように使用するのか分かりません。同じカラムに値があり、countでソートしたいのです()は、状態の出現回数に基づいています。

+0

あなたはどのような出力をしたいですか? –

答えて

2

は私が

// Get a collection of state names as keys 
// and the frequency of each state as values, 
// sorted by the frequency descending 

$states_count = $user->friends->groupBy('state')->map(function ($states) { 
    return $states->count(); 
})->sort()->reverse(); 
状態からの友人の最低額に状態からの友人 の最大量から順に状態をソートし、(その状態のため、友人との合計量)のカウント を表示したいです

あなたがして、フレンドリスト自体はその状態頻度順にソートしたい場合は 、

// (If the states of any friends pair have equal frequency 
// in the states list, sort those by state name alphabetically). 

$friends_sorted = $user->friends->sort(function ($f1, $f2) use ($states_count) { 
    if ($states_count->get($f1->state) < $states_count->get($f2->state) 
     return 1; 
    if ($states_count->get($f1->state) > $states_count->get($f2->state) 
     return -1; 

    return strcmp($f1->state, $f2->state); 
}); 
+0

私は$ f1と$ f2変数の使い方について混乱しましたが、あなたの$ states_count変数を使って動作するように私のコードを残しました – Luna

0

あなたはこのような1つのSQLクエリでそれを行うことができます。

SELECT state, friends, (SELECT SUM(friends) FROM friend_tbl) AS friend_total 
FROM friend_tbl ORDER BY friends DESC 

「friend_total」は繰り返されますが、これは一つのアプローチであるので、少し奇妙に見えるだろう。あなたはため、「同じMySQL欄に」データををしたい場合は

STATE |FRIENDS|FRIEND_TOTAL 
new york |100 |190 
texas |70  |190 
florida |20  |190 
+1

は 'SELECT状態、COUNT(*)FROM friends_tbl GROUP BY 1 ORDER BY 2 DESC' – alepeino

+0

@Alejandro:いいえ – ldg

0

は、あなたが(colTempNameをQUERYの時間列を作成し、それがカウンターを作成し、データをソートして用RAWクエリのいくつかの種類を確認する必要があり内側のクエリは、各外側の記録のために再び発射されているので、あなたが選択で選択してトラブルに来るかもしれない

SELECT col1,col2,state,count(*) AS colTempName 
FROM [...] 
(WHERE [...]/JOIN [...]) 
GROUP BY columnbased_name_todo_count 
ORDER BY colTempName,state 
0

:)

あなたはいろいろ書いように行う必要があります。テーブルを正規化してJOINを使用することをお薦めします。

以下のテストデータベースを考慮してください。データ)

CREATE TABLE `state` (
    `state_id` int(11) NOT NULL, 
    `name` varchar(80) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `state` (`state_id`, `name`) VALUES 
(1, 'Florida'), 
(2, 'California'), 
(3, 'Wisconsin'), 
(4, 'New Jersey'); 

CREATE TABLE `user` (
    `user_id` int(11) NOT NULL, 
    `state_id` int(11) NOT NULL, 
    `name` varchar(80) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `user` (`user_id`, `state_id`, `name`) VALUES 
(1, 1, 'Person 1'), 
(2, 2, 'Person 2'), 
(3, 1, 'Person 3'), 
(4, 3, 'Person 4'), 
(5, 1, 'Person 5'), 
(6, 1, 'Person 6'), 
(7, 1, 'Person 7'), 
(8, 3, 'Person 8'); 

CREATE TABLE `user_friend` (
    `user_id` int(11) NOT NULL, 
    `friend_id` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `user_friend` (`user_id`, `friend_id`) VALUES 
(1, 2), 
(1, 3), 
(1, 4), 
(1, 5), 
(1, 6), 
(1, 7), 
(1, 8), 
(2, 1), 
(2, 5), 
(2, 7), 
(2, 8); 

ALTER TABLE `state` 
    ADD PRIMARY KEY (`state_id`); 

ALTER TABLE `user` 
    ADD PRIMARY KEY (`user_id`); 

ALTER TABLE `user_friend` 
    ADD PRIMARY KEY (`user_id`,`friend_id`); 

user_friendの「friend_id」は()別のユーザーに戻ってユーザテーブルに接続されています。

私は4つの州から8人を使用していますが、2人しか友人がいません。ほとんどの人はフロリダに住んでいます。

友人がいる人のリストと、状態の友人の名前と、降順でソートされた人のリストを照会します。読書のための

SELECT 
    u.name as username, 
    s2.name as friend_state, 
    count(s2.state_id) as friends 
FROM 
    `user` u 
INNER JOIN 
    user_friend uf on u.user_id = uf.user_id 
INNER JOIN 
    user f on f.user_id = uf.friend_id 
INNER JOIN 
    state s2 on s2.state_id = f.state_id 
GROUP BY uf.user_id, s2.state_id 
ORDER BY count(s2.state_id) DESC 


+----------+--------------+---------+ 
| username | friend_state | friends | 
+----------+--------------+---------+ 
| Person 1 | Florida  | 4  | 
| Person 1 | Wisconsin | 2  | 
| Person 1 | California | 1  | 
| Person 2 | Florida  | 3  | 
| Person 2 | Wisconsin | 1  | 
+----------+--------------+---------+ 

感謝;)

関連する問題