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
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"
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.
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.