2016-08-19 1 views
2

Ich habe zwei Tabellen auf MYSQL, ich frage mich, ob es eine Aggregatfunktion auf MySQL als array_agg() FROM postgreSQL.MYSQL Array-Aggregat Funktion wie PostgreSQL array_agg

Tabelle 1: Eigenschaften haben nur 8 Aufzeichnungen Tabelle 2: Aufzeichnungen, die das Eigentum erfasst, so dass manchmal 1 sein kann oder n-mal für die gleiche Eigenschaft, und ich habe diese Qry:

SELECT p.id, pcb.users_admin_id as uid 
FROM properties p 
INNER JOIN prop_captured_by pcb ON p.id = pcb.property_id 
-- GROUP BY p.id 

id uid 
200 1 
200 80 
202 1 
202 80 
211 1 
211 10 
211 81 
215 10 ... 

Wenn ich das verwenden GROUP BY Teil dieses erhalte ich:

id uid 
200 1 
202 1 
211 1 
215 10 ... 

verlieren alle anderen Daten als der erste Wert für users_admin_id. Ich weiß, dass ich mein gewünschtes Ergebnis mit der Funktion array_agg() von postgreSQL erreichen kann, aber ich kann nicht herausfinden, wie man es auf MYSQL macht.

Das ist mein Wunsch Ergebnis:

id uid 
200 1,80 //an array, I don't mind about the separator, could be anything. 
202 1,80 
211 1,10,81 
215 10 ... 

ich versucht habe, UNION, GROUP BY, INNER JOIN ... kein Glück ... Alle Zeiger?

UPDATE

ich die many to many relations von diesem Kerl verwenden. Hofft, dass es für jemand anderen nützlich ist. Ich brauchte den Namen des Benutzers aus einer dritten Tabelle hinzuzufügen, so dass die endgültige Abfrage sieht wie folgt aus:

SELECT p.id, group_concat(pcb.users_admin_id) as uid, group_concat(ua.name) as uin 
FROM properties p 
INNER JOIN prop_captured_by pcb ON p.id = pcb.property_id 
INNER JOIN users_admin ua ON ua.id = pcb.users_admin_id 
group by p.id; 

Antwort

8

Sie wollen 5.7.22 JSON_ARRAYAGG() und JSON_OBJECTAGG() eingeführt GROUP_CONCAT() wie

SELECT p.id, group_concat(pcb.users_admin_id) as uid 
FROM properties p 
INNER JOIN prop_captured_by pcb 
ON p.id = pcb.property_id 
group by p.id; 
+0

funktioniert es für mich! –

5

Ich glaube, Sie wollen group_concat():

SELECT p.id, GROUP_CONCAT(pcb.users_admin_id) as uids 
FROM properties p INNER JOIN 
    prop_captured_by pcb 
    ON p.id = pcb.property_id 
GROUP BY p.id; 

Dieses eine durch Kommata getrennte Zeichenfolge erzeugt, aber das ist so nah an einem Array, das Sie in MySQL bekommen.

0

MySQL verwenden. Da Sie den Benutzernamen als auch wollen, können Sie das letztere verwenden:

SELECT p.id, JSON_OBJECTAGG(pcb.users_admin_id, ua.name) as uin 
FROM properties p 
INNER JOIN prop_captured_by pcb ON p.id = pcb.property_id 
INNER JOIN users_admin ua ON ua.id = pcb.users_admin_id 
group by p.id; 

DB Fiddle