Avatar billede Mik2000 Professor
15. april 2015 - 12:53 Der er 5 kommentarer og
1 løsning

SQL spørgsmål - svær sql

Har et problem jeg har forsøgt at løse længe, men som jeg ikke kan gennemskue. Jeg arbejder i PHP med MySQL, men det er kun SQL delen jeg har brug for hjælp til. Har forenklet eksemplet lidt i dette indlæg

Har en tabel

------------------
tabel1
------------------
id
subid
sub2id
------------------

Jeg vil gerne tælle hvor mange gange en kombination af sub2id'er findes, hvor de har samme subid, og hvor der ikke er flere/færre sub2id'er

---------------------------------------
Eksempel
---------------------------------------

Test data
1, 1, 1
1, 1, 2
1, 1, 3
1, 2, 1
1, 2, 2
1, 3, 5
1, 4, 1
1, 5, 1
1, 5, 2
1, 5, 3

---------------------------------------

Tjek på 1, 2, 3 i sub2_id
Giver en count på 2 fordi kombinationen findes i
1, 1, 1
1, 1, 2
1, 1, 3
OG
1, 5, 1
1, 5, 2
1, 5, 3
Begge matcher og der er ikke hverken flere eller færre

---------------------------------------

Tjek på 1, 2 i sub2id
Giver en count på 1 fordi kombinationen findes i
1, 2, 1
1, 2, 2
Begge matcher og der er ikke hverken flere eller færre

1, 4, 1 Tælles ikke fordi 2 ikke er med i 4

1, 1, 1
1, 1, 2
1, 1, 3
1, 5, 1
1, 5, 2
1, 5, 3
Ovenstående tælles ikke med fordi 3 også er med

---------------------------------------

Er lidt svært at forklare, men håber det er til at forstå :) - ellers så spørg endelig
Avatar billede gnoname Praktikant
15. april 2015 - 16:18 #1
Nu ved jeg jo ikke hvordan du angiver/indsætter værdierne i din select, men et check på (1,2) kunne se således ud:

select *
from  tabel1
where  (id, subid) in (
  select id, subid
  from (
    select id, subid, count(*) antal
    from  tabel1
    where  sub2id in (1,2)
    group by id, subid
    having count(*) = 2)
  )


hvis checket var på (1,2,3) skulle det så tilsvarende være:
"having count(*) > 3"
Avatar billede Mik2000 Professor
15. april 2015 - 20:08 #2
Hej

Takker for svar igen :)
Prøvede lige.
Den sagde den vil have nogle alias, så prøvede med understående

select *
from  tabel1 a1
where  (id, subid) in (
  select id, subid
  from (
    select id, subid, count(*) antal
    from  tabel1 a2
    where  sub2id in (1,2)
    group by id, subid
    having count(*) = 2) a3
  )

Den returnere dog ingen rækker, og har lidt svært ved at gennemskue hvorfor, da jeg har lidt svært ved at gennemskue den 100%

Det er fordi subid er et besked id
Sub2id er et user id

Det er lidt i henhold til tidligere du hjalp med - forenklede bare lige strukt
Tabellen er den der sætter users sammen med samtaler
subid er samtale id
sub2id er user id

Og ideen er man skal vide hvor mange samtaler der i forvejen er mellem de brugere.
Avatar billede gnoname Praktikant
15. april 2015 - 23:49 #3
OK, jeg kan også se at min select ikke helt holder (den bør/vil nemlig også give hit på forekomster, hvor der optræder flere end de forespurgte Sub2id'er).

Derfor tror jeg denne udgave holder bedre:

SELECT count(*)
from (
  SELECT DISTINCT c.id, c.subid
  FROM
  (SELECT a.id, a.subid, count(*) antal
    FROM  tabel1 a
    WHERE  a.sub2id IN (1,2)
    AND (a.id, a.subid) NOT IN (
      SELECT DISTINCT b.id, b.subid
      FROM  tabel1 b
      WHERE  b.sub2id NOT IN (1,2)
      )
    GROUP BY a.id, a.subid
    HAVING COUNT(*) = 2) c
  ) d

Det der gør det kringlet, er den dynamiske mængde af sub2id'er.
Avatar billede Mik2000 Professor
24. juni 2015 - 22:49 #4
Hov - fik aldrig svaret dig - fik lige en email reminder fra eksperten.

Det lykkedes med hjælp fra det sidste :)
Tak for hjælpen - point er selvfølgelig dine :)
Avatar billede gnoname Praktikant
25. juni 2015 - 09:02 #5
Det er helt OK :-)
Avatar billede Mik2000 Professor
26. juni 2015 - 22:17 #6
Tak for hjælpen og tålmodigheden med point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester