2016-07-16 15 views
0

Ich versuche, eine Laravel-Sammlung nach Anzahl zu sortieren. Ich habe einen DB: Benutzer, die ich in meinem DB eine Spalte namens Staat befindet, der Heimatstaat Beispiel des Benutzers speichert: FloridaWie Werte in derselben mysql-Spalte basierend auf Anzahl oder Anzahl der Vorkommen sortiert werden

Ich ziehe die Sammlung etwas wie folgt aus:

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

dann in der Ausblick:

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

ich mag die Zustände in der Reihenfolge von größter Menge an Freunden von Staat zu mindestens sortieren Menge Freunde von Staat und zeigt die Zählung (Gesamtmenge von Freunden für diesen Zustand)

Beispiel: Wenn Newyork 100 Freunde hat, Texas 70 Freunde hat, und Florida 20 Freunde hat, dann wäre das Ergebnis:

Newyork 100

Texas 70

20 Florida

I Ich weiß, dass ich Funktionen wie count(), sort() und sortBy() verwenden kann, aber ich weiß nicht, wie ich es für diesen Fall verwenden soll, da ich die Werte in derselben Spalte habe und sie nach Anzahl sortieren möchte(), basierend auf der Anzahl der Vorkommen erscheinen die Zustände.

+0

Welche Ausgabe möchten Sie tun ?? –

Antwort

2

Ich mag aus den Staaten, um von größter Menge an Freunden sortieren Zustand geringste Menge an Freunden von Staat und zeigen die Zählung (Gesamtmenge von Freunden für diesen Zustand)

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

Wenn Sie dann die Freunde-Liste wollen sich von diesem Zustand Frequenzreihenfolge sortiert werden,

// (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

Ich war ein wenig verwirrt, wie die Variablen $ f1 und $ f2 zu verwenden, aber immer noch mein Code zu arbeiten mit Ihrer $ states_count-Variable – Luna

0

Sie können es in einer SQL-Abfrage wie folgt tun:

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

Es ist ein wenig seltsam aussehen geht, da „friend_total“ wiederholt wird, aber dies ist ein Ansatz.

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

wäre das nicht SELECT Zustand, COUNT (*) FROM freunde_tbl GROUP BY 1 ORDER BY 2 DESC' – alepeino

+0

@Alejandro: nein – ldg

0

Wenn Sie wollen „IN SAME mysql Spalte“, um die Daten, müssen Sie für erstellen ein zeitliches COLUMN IN QUERY eine Art von RAW-Abfrage machen und damit Zähler machen und Daten sortieren (colTempName)

benötigen Sie einen Grund zum zu tun:

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

Sie in Schwierigkeiten mit wählt in ausgewählten kommen kann, da innere Abfragen für jede äußere Datensatz erneut abgefeuert werden. Bessere Normalisierung Ihrer Tabellen und Verwendung von JOINs

Betrachten Sie die folgende Testdatenbank (inkl.Daten)

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

Die „friend_id“ von user_friend werden zurück zu der Benutzertabelle (an einem anderen Benutzer) verbunden ist.

Ich benutze 8 Personen aus 4 verschiedenen Staaten, nur 2 haben Freunde. Die meisten Menschen leben in Florida.

Jetzt eine Liste von Personen abfragen, die Freunde haben, zusammen mit dem Namen und der Anzahl der Freunde in dem Bundesstaat, absteigend sortiert.

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  | 
+----------+--------------+---------+ 

Dank für das Lesen;)

Verwandte Themen