Avatar billede kviller Novice
30. juli 2008 - 20:47 Der er 33 kommentarer og
1 løsning

Modsat af distinkt?

Jeg logger alle der logger ind i en tabel med UserID og IP - Er det muligt at lave en SQL query hvor jeg får result hvis der er 2 eller flere UserID der har logget på fra samme IP?

Tabel ser sådan ud.

ID, UserID, IP, Date hvor den skriver til hver gang man logger på
Avatar billede kviller Novice
30. juli 2008 - 20:48 #1
Og det jeg skal finde ud af er om samme IP har flere userID's
Avatar billede terry Ekspert
30. juli 2008 - 20:53 #2
SELECT * FROM YourTable
Avatar billede kviller Novice
30. juli 2008 - 20:54 #3
Ja, så giver det alt, (Cirka 60.000 rows) Jeg vil kun have de rows hvor IP er det samme som i en anden row og hvor at UserID er forskellig.
Avatar billede arne_v Ekspert
30. juli 2008 - 20:55 #4
proev:

SELECT userid,COUNT(*) AS n
FROM tabel
GROUP BY userid
HAVING COUNT(*) > 1

eller:

SELECT userid,COUNT(*) AS n
FROM tabel
GROUP BY userid
HAVING n > 1
Avatar billede terry Ekspert
30. juli 2008 - 20:56 #5
and maybe an order by so you can see IP in correct order

SELECT * FROM YourTable ORDER BY IP, UserID, [Date]
Avatar billede terry Ekspert
30. juli 2008 - 20:57 #6
ah´, didnt see that, must be the weather (hvis der er 2 eller flere UserID )
Avatar billede kviller Novice
30. juli 2008 - 21:15 #7
Arne. Første query giver mig antal login for brugeren og den næste giver fungere ikke :(
Avatar billede kviller Novice
30. juli 2008 - 21:18 #8
Hvis man bare kunne lave den sådan:

SELECT userid,COUNT(*) AS n
FROM tabel
GROUP BY userid
HAVING COUNT(*) > 1
WHERE IP = (Ip in another row)
Avatar billede arne_v Ekspert
30. juli 2008 - 21:22 #9
saa proev:

SELECT ip,COUNT(DISTINCT userid) AS n
FROM tabel
GROUP BY ip
HAVING COUNT(DISTINCT userid) > 1
Avatar billede kviller Novice
30. juli 2008 - 21:36 #10
Det fungere heller ikke, men tror det er i den rigtige retning.
Avatar billede arne_v Ekspert
30. juli 2008 - 21:43 #11
Kan du uddybe "fungere heller ikke" ?
Avatar billede erikjacobsen Ekspert
30. juli 2008 - 21:44 #12
Burde være nok med

SELECT ip,userid,count(*)
FROM tabel
GROUP BY ip,userid
HAVING COUNT(*) > 1
Avatar billede erikjacobsen Ekspert
30. juli 2008 - 21:46 #13
Næh, jeg skal vist bruge et par sekunder mere på at læse spørgsmålet ;)
Avatar billede kviller Novice
30. juli 2008 - 21:48 #14
arne v - Jeg er ikke helt klar over hvad den giver, men det er IP og så et tal som n som jeg går ud fra er UserID?
Avatar billede arne_v Ekspert
30. juli 2008 - 21:59 #15
n burde vaere antallet af userid'er som har brugt den paagaeldende IP
Avatar billede arne_v Ekspert
30. juli 2008 - 21:59 #16
Skal du ogsaa have userid'erne ud ?
Avatar billede kviller Novice
30. juli 2008 - 21:59 #17
Hvis jeg tager de IP resultater jeg får fra

SELECT ip,COUNT(DISTINCT userid) AS n
FROM tabel
GROUP BY ip
HAVING COUNT(DISTINCT userid) > 1

og laver en

SELECT DISTINCT LoginID
      ,[UserID]
      ,[IP]
  FROM [akvariefisk].[dbo].[User_Login]
WHERE IP = De Ip adresser fra sidste forespørgsel
ORDER BY UserID

Så har jeg det resultat jeg gerne vil have. Kan man lave de 2 sammen til en?
Avatar billede kviller Novice
30. juli 2008 - 22:00 #18
Det skulle selvfølgelig være DISTINCT UserID
Avatar billede arne_v Ekspert
30. juli 2008 - 22:04 #19
SELECT * FROM andentabel
WHERE ip IN (SELECT x.ip
FROM (SELECT ip,COUNT(DISTINCT userid) AS n
      FROM tabel
      GROUP BY ip
      HAVING COUNT(DISTINCT userid) > 1) x)
Avatar billede arne_v Ekspert
30. juli 2008 - 22:05 #20
maaske endda (jeg ved ikke om SQLServer spiser den):

SELECT * FROM andentabel
WHERE ip IN (SELECT ip
      FROM tabel
      GROUP BY ip
      HAVING COUNT(DISTINCT userid) > 1) x)
Avatar billede kviller Novice
30. juli 2008 - 22:10 #21
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'x'.

Det er den samme tabel i begge - Jeg vil bare have de UserID ud hvor der er flere UserID med samme IP adresse.
Avatar billede kviller Novice
30. juli 2008 - 22:11 #22
hov Kiggede lige lidt nærmere Kom til at kopiere x) med ind Flovt
Avatar billede kviller Novice
30. juli 2008 - 22:13 #23
Den spiser den godt nok, men giver mig 115895 rows retur. Mange med samme UserID og IP
Avatar billede arne_v Ekspert
30. juli 2008 - 22:17 #24
Bruger du min

SELECT * FROM andentabel

eller din

SELECT DISTINCT LoginID
      ,[UserID]
      ,[IP]
  FROM [akvariefisk].[dbo].[User_Login]

din DISTINCT goer maaske en forskel !
Avatar billede kjulius Novice
31. juli 2008 - 00:07 #25
Kan man ikke bare skrive:

SELECT DISTINCT LoginID, UserID, IP
FROM akvariefisk.dbo.User_Login
WHERE IP IN (
  SELECT IP
  FROM akvariefisk.dbo.User_Login
  GROUP  BY IP
  HAVING COUNT(DISTINCT UserID) > 1)

Det er stort set det samme som det arne_v skriver, bortset fra, at jeg ikke medtager COUNT'en i subselectens SELECT del, hvilket gør den lidt nemmere at håndtere.

I stedet for at bruge en traditionel subselect, var det måske også muligt at bruge en konstruktion med en inline tabel. Jeg tænker på noget lign. dette:

SELECT DISTINCT t1.LoginID, t1.UserID, t1.IP
FROM [akvariefisk].[dbo].[User_Login] AS t1
INNER JOIN (
  SELECT IP
  FROM [akvariefisk].[dbo].[User_Login]
  GROUP BY IP
  HAVING COUNT(DISTINCT UserID)>1
  ) AS t2 ON t1.ip=t2.ip

Jeg ved ikke, om sådan en inline tabel konstruktion med join er mere effektiv end en subselect konstruktion, det må en test vise. For begge gælder, at det bør hjælpe, hvis der er et index på IP feltet.

Udgangspunktet for begge mine forslag til forespørgsler er det samme som arne_v er kommet frem til.


Ved nærmere eftertanke bør rækkefølgen på den sidste nok ændres. Det optimale er altid, at placere den "tabel" med mindst rækker først. I dette tilfælde altså den med de "udvalgte" IP:


SELECT DISTINCT t2.LoginID, t2.UserID, t2.IP
FROM (
  SELECT IP
  FROM [akvariefisk].[dbo].[User_Login]
  GROUP BY IP
  HAVING COUNT(DISTINCT UserID)>1
  ) AS t1
INNER JOIN [akvariefisk].[dbo].[User_Login] AS t2 ON t1.ip=t2.ip
Avatar billede kjulius Novice
31. juli 2008 - 00:20 #26
Hvis du arbejder på en 2005 udgave as SQL server kan den sidste også skrives som:

WITH t1 AS (
  SELECT IP
  FROM [akvariefisk].[dbo].[User_Login]
  GROUP BY IP
  HAVING COUNT(DISTINCT UserID)>1)
SELECT DISTINCT t2.LoginID, t2.UserID, t2.IP
FROM t1
INNER JOIN [akvariefisk].[dbo].[User_Login] AS t2 ON t1.ip=t2.ip

I dette tilfælde gør det ikke den store forskel, men hvis man arbejder med mange inline tabeller, som måske er nestede, gør det forespørgslen lidt lettere at læse, synes jeg. Men det er en smagssag.
Avatar billede kjulius Novice
31. juli 2008 - 00:34 #27
Da vi nu er i gang, så kan også versionen med en subselect skrives lidt anderledes:

SELECT DISTINCT LoginID, UserID, IP
FROM akvariefisk.dbo.User_Login t
WHERE EXISTS (
  SELECT IP
  FROM akvariefisk.dbo.User_Login
  WHERE IP = t.IP
  GROUP BY IP
  HAVING COUNT(DISTINCT UserID) > 1)

Med SQL er der sjældent kun én mulig løsning. :-)
Problemet er at finde den bedste!
Avatar billede arne_v Ekspert
31. juli 2008 - 00:37 #28
re 31/07-2008 00:07:05>

Det var det jeg foreslog 30/07-2008 22:05:42
Avatar billede kjulius Novice
31. juli 2008 - 00:42 #29
Forresten, giver det ikke et problem, at du medtager LoginID i din SELECT DISTINCT? Det ophæver jo i realiteten værdien af DISTINCT (hvis jeg ellers har ret i, at LoginID er primær nøglen på tabellen)?

Jeg tror du bliver nødt til at nøjes med
SELECT DISTINCT UserID, IP
Avatar billede kjulius Novice
31. juli 2008 - 00:55 #30
--> arne_v:
Ja, beklager, hvis det ikke fremgår klart nok. Det var dog først da jeg så kvillers kommentar fra 30/07-2008 22:11:38, at jeg fangede din typo med " x)". Den fejl havde jeg i første omgang overset og bare konstateret (fejlagtigt), at du stadig arbejdede med en kombineret inline tabel/subselect som i 30/07-2008 22:04:25.
Avatar billede kviller Novice
31. juli 2008 - 22:00 #31
Re: 31/07-2008 00:34:03 Så ser det ud til at virke som jeg ønskede. Jeg skulle bare lige slette LoginID fra distinct og bruge UserID :)

Som jeg skrev i 30/07-2008 22:00:42 var det en fejl jeg skrev LoginID Det skulle have været userID. :)
Avatar billede kjulius Novice
31. juli 2008 - 22:34 #32
Har du prøvet alle versionerne? Der er sikkert forskel i udførelseshastigheden (hvis de da ellers virker, det er jeg jo ikke sikker på). :-)
Avatar billede kviller Novice
20. august 2008 - 18:26 #33
Kjulius skriver du ikke lige et svar? Så kan du få points, det virker som det skal :) Takker
Avatar billede kviller Novice
10. september 2008 - 15:44 #34
Kjulius? ^^
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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