2016-08-29 10 views
0

Ich habe Daten in folgender Form, ich wollte die usernames Spalte basierend auf Specfic user_id sortieren, die ich von user_ids Array finden muss.SQL - Sortieren spezifische Spalte basierend auf einer anderen Spalte

usernames  | empno | user_ids |  
------------------+--------------------- 
{ Akon, Den } | 11 | { 12, 13 } | 
{ John, Nash } |  7 | { 15, 12 } | 
{ Ahmad, Umar }|  9 | { 18, 12 } | 

Forexample, Benutzernamen mit user_id = 12 sollte zuerst angezeigt. Das Ergebnis würde wie folgt aussehen:

usernames  | empno |  
------------------+-------- 
{ Akon, Den } | 11 | 
{ Nash, John } |  7 | 
{ Umar, Ahmad }|  9 | 

Ich bin mir sicher, dass es in Postgres den einfachsten Weg dafür geben würde. Diese Struktur ist nur ein Beispiel.

+0

warum tut ein user_id Karte auf mehrere USER_NAMES? –

+1

Comma-separierte Daten sind nicht die SQL-Methode, das Design verursacht nur eine Menge Ärger ... (Und macht einfache Dinge sehr schwierig.) – jarlh

+0

@jarlh Es ist gemäß meiner Datenbankarchitektur, dass ich einige Informationen in CSV exportieren muss weil ich so etwas tun muss. –

Antwort

1

Nun, das größte Problem hier ist, dass Sie mit Arrays arbeiten, die Dinge tatsächlich schwieriger machen. Wenn Sie wirklich keine normalisierten Daten in Ihrer Datenbank haben, können Sie unnest function verwenden, um es Zeile für Zeile und Array_agg zu machen, um die Arrays zurück zu bekommen. Wenn Sie auf 9.4+ sind, ist es einfach wie:

SELECT 
    t.empno, 
    array_agg(u.username ORDER BY u.user_id) AS username_agg, 
    array_agg(u.user_id ORDER BY u.user_id) AS user_id_agg 
FROM 
    your_table t, 
    unnest(t.usernames, t.user_ids) AS u(username, user_id) 
GROUP BY 
    t.empno 
ORDER BY 
    user_ids_agg 

Vor 9.4 Sie nicht SEITEN Fragen haben noch unnest mit vielen Parametern ab, so wäre es ein bisschen härter sein:

SELECT 
    t.empno, 
    array_agg(t.username ORDER BY t.user_id) AS username_agg, 
    array_agg(t.user_id ORDER BY t.user_id) AS user_id_agg 
FROM 
    (
     SELECT 
      t1.empno, 
      unnest(t1.usernames) AS username, 
      unnest(t1.user_ids) AS user_id 
     FROM 
      your_table t1 
    ) t 
GROUP BY 
    t.empno 
ORDER BY 
    user_ids_agg 

Beide Lösungen Angenommen, Sie haben in beiden Arrays für jede Zeile die gleiche Anzahl an Elementen.

Bitte lassen Sie mich wissen, wenn der Code nicht ausgeführt wird (ich habe es nicht wirklich versucht, also könnte es ein Tippfehler oder Logikproblem gewesen sein).

0

@MuhamamdAwais wenn Sie sortieren über das erste Element des user_ids wird, dies versuchen: select usernames,empno from your_table order by user_ids[1]

Verwandte Themen