15. april 2015 - 12:53Der 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 ---------------------------------------
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
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"
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.
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.
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.