簡體   English   中英

如何根據次數或出現次數對同一mysql列中的值進行排序

[英]How to sort values in same mysql column based on count or number of occurences

我正在嘗試按數量對laravel集合進行排序。 我有一個數據庫:USERS,在我的數據庫中有一個名為State的列,該列存儲用戶的原籍州示例:Florida

我正在收集這樣的東西:

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

然后在視圖中:

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

我想按狀態從最大數量的朋友到最小狀態的朋友排序狀態,並顯示計數(該狀態的朋友總數)

示例:如果Newyork有100個朋友,Texas有70個朋友,Florida有20個朋友,那么結果將是:

紐約100

德州70

佛羅里達20

我知道我可以使用count(),sort()和sortBy()之類的函數,但是我不知道如何在這種情況下使用它,因為我在同一列中有值並且想按它們排序count(),基於狀態出現的次數。

我想按狀態從最大數量的朋友到最小狀態的朋友排序狀態,並顯示計數(該狀態的朋友總數)

// 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);
});

您可以像這樣在一個sql查詢中執行此操作:

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

由於將重復“ friend_total”,因此看起來有些奇怪,但這是一種方法。

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

如果要“在相同的mysql列中”對數據進行排序,則需要進行某種RAW查詢以創建在查詢中的TEMPORAL COLUMN,並使用它進行計數器和排序數據(colTempName)

您需要做一些事情:

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

您可能會對select中的select遇到麻煩,因為對於每個外部記錄都會再次觸發內部查詢。 更好地規范您的表並使用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       |
+----------+--------------+---------+

謝謝閱讀 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM