sql >> Databasteknik >  >> RDS >> Mysql

Hur får man flera poster mot en post baserat på relation?

Den ursprungliga frågan var databasspecifik, men det här är kanske ett bra ställe att inkludera ett mer allmänt svar. Det är en vanlig fråga. Konceptet som du beskriver kallas ofta för "gruppsammankoppling". Det finns ingen standardlösning i SQL-92 eller SQL-99. Så du behöver en leverantörsspecifik lösning.

  • MySQL - Använd den inbyggda GROUP_CONCAT-funktionen. I ditt exempel skulle du vilja ha något sånt här:
select 
  o.ID, o.Address, o.OtherDetails,
  GROUP_CONCAT( concat(e.firstname, ' ', e.lastname) ) as Employees
from 
  employees e 
  inner join organization o on o.org_id=e.org_id
group by o.org_id
  • PostgreSQL - PostgreSQL 9.0 är lika enkelt nu när string_agg(uttryck, avgränsare) är inbyggt. Här är det med 'komma-mellanslag' mellan elementen:
select 
  o.ID, o.Address, o.OtherDetails,
  STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) as Employees
from 
  employees e 
  inner join organization o on o.org_id=e.org_id
group by o.org_id

PostgreSQL före 9.0 låter dig definiera dina egna aggregerade funktioner med CREATE AGGREGATE. Lite mer arbete än MySQL, men mycket mer flexibelt. Se denna annat inlägg för mer detaljer. (Självklart har PostgreSQL 9.0 och senare detta alternativ också.)

  • Oracle - Samma idé med LISTAGG .

  • MS SQL Server - samma idé med STRING_AGG

  • Reservlösning - i andra databasteknologier eller i mycket gamla versioner av teknikerna som anges ovan har du inte dessa gruppsammankopplingsfunktioner. Skapa i så fall en lagrad procedur som tar org_id som indata och matar ut de sammanlänkade medarbetarnamnen. Använd sedan denna lagrade procedur i din fråga. Några av de andra svaren här inkluderar några detaljer om hur man skriver lagrade procedurer som dessa.

select 
  o.ID, o.Address, o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from 
  organization o


  1. Hur man installerar och säkrar MariaDB på Debian 9

  2. $result =mysql_query()

  3. Hur skickar man e-post från SQL Server?

  4. MySQL-förälder -> underordnad fråga