sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL var allt i array

Förutsatt att kopplingstabellen följer god praxis och har en unik sammansatt nyckel definierad, d.v.s. en begränsning för att förhindra dubbletter av rader, då borde något i stil med följande enkla fråga fungera.

select conversation_id from conversations_users where user_id in (1, 2)
group by conversation_id having count(*) = 2

Det är viktigt att notera att siffran 2 i slutet är längden på listan med user_id. Det måste uppenbarligen ändras om user_id-listan ändrar längd. Om du inte kan anta att din anslutningstabell inte innehåller dubbletter, ändra "count(*)" till "count(distinct user_id)" till en möjlig kostnad i prestanda.

Den här frågan hittar alla konversationer som inkluderar alla angivna användare även om konversationen inkluderar också ytterligare användare.

Om du bara vill ha konversationer med exakt den angivna uppsättningen användare är ett tillvägagångssätt att använda en kapslad underfråga i where-satsen enligt nedan. Observera att första och sista raden är desamma som den ursprungliga frågan, endast de två mittersta raderna är nya.

select conversation_id from conversations_users where user_id in (1, 2)
   and conversation_id not in
   (select conversation_id from conversations_users where user_id not in (1,2))
group by conversation_id having count(*) = 2

På motsvarande sätt kan du använda en set difference-operator om din databas stöder det. Här är ett exempel i Oracle-syntax. (För Postgres eller DB2, ändra nyckelordet "minus" till "except.)

select conversation_id from conversations_users where user_id in (1, 2)
  group by conversation_id having count(*) = 2
minus
  select conversation_id from conversations_users where user_id not in (1,2)

En bra frågeoptimerare bör behandla de två sista varianterna identiskt, men kontrollera med din specifika databas för att vara säker. Oracle 11GR2-frågeplanen sorterar till exempel de två uppsättningarna av konversations-ID:n innan minusoperatorn används, men hoppar över sorteringssteget för den sista frågan. Så båda frågeplanerna kan vara snabbare beroende på flera faktorer som antalet rader, kärnor, cache, index etc.



  1. Tidszonkonvertering i SQL-fråga

  2. PL/pgSQL kolumnnamn samma som variabel

  3. Varför är det bäst att lagra ett telefonnummer som en sträng kontra heltal?

  4. 10 effektiva sätt att bli mer produktiv på jobbet