sql >> Database teknologi >  >> RDS >> Mysql

Hvordan får man flere poster mod én post baseret på relation?

Det oprindelige spørgsmål var databasespecifikt, men måske er dette et godt sted at inkludere et mere generisk svar. Det er et almindeligt spørgsmål. Konceptet, som du beskriver, omtales ofte som 'Gruppesammenkædning'. Der er ingen standardløsning i SQL-92 eller SQL-99. Så du skal bruge en leverandørspecifik løsning.

  • MySQL - Brug den indbyggede GROUP_CONCAT-funktion. I dit eksempel vil du gerne have noget som dette:
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 er lige så enkel nu, hvor string_agg(udtryk, afgrænser) er indbygget. Her er det med 'komma-mellemrum' mellem elementer:
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ør 9.0 giver dig mulighed for at definere dine egne samlede funktioner med CREATE AGGREGATE. Lidt mere arbejde end MySQL, men meget mere fleksibelt. Se denne andet indlæg for flere detaljer. (Selvfølgelig har PostgreSQL 9.0 og senere også denne mulighed.)

  • Oracle - samme idé ved hjælp af LISTAGG .

  • MS SQL Server - samme idé ved hjælp af STRING_AGG

  • Falback-løsning - i andre databaseteknologier eller i meget meget gamle versioner af teknologierne nævnt ovenfor har du ikke disse gruppesammenkædningsfunktioner. I så fald skal du oprette en lagret procedure, der tager org_id'et som input og udlæser de sammenkædede medarbejdernavne. Brug derefter denne lagrede procedure i din forespørgsel. Nogle af de andre svar her inkluderer nogle detaljer om, hvordan man skriver lagrede procedurer som disse.

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


  1. php begrænsning overtrædelse Fejl 1452

  2. 'PDOException' med beskeden 'SQLSTATE[22001]:Strengdata, højre trunkeret:0

  3. Test af Android SQLite-databaseenhed

  4. Udførelse af simpel aritmetik i MySQL-sætning eller i PHP-kode