Avatar billede jmp.dk Nybegynder
12. april 2006 - 10:00 Der er 6 kommentarer og
1 løsning

Advanced query

Jeg har problem med at lave en query der giver hvad jeg vil have.
Har lavet to demo tabeller:

NAME
-------------------------
ID        NAME    |
-------------------------
1        Test    |
2        Test2    |
-------------------------

CONTACT
-----------------------------------------
NAME_ID    DATE            STATUS    |
-----------------------------------------
1    15-02-2006 15:21    1    |
1    15-02-2006 11:12    1    |
1    15-02-2006 16:45    1    |
1    15-02-2006 09:15    0    |
1    15-02-2006 08:56    0    |
2    15-02-2006 14:21    0    |
1    15-02-2006 13:29    0    |
2    15-02-2006 17:11    1    |
-----------------------------------------

Det jeg har brug for er en række for hver navn og et minimum tid hvor status er 0 og en maksimum tid hvor status er 1.

DVS Resultat settet af den query jeg har brug for er:
NAME    STARTTIME        ENDTIME
-------------------------------------------------
Test    15-02-2006 08:56    15-02-2006 16:45|
Test2    15-02-2006 14:21    15-02-2006 17:11|
Avatar billede ldanielsen Nybegynder
12. april 2006 - 11:00 #1
SELECT Name,
(SELECT Min(Date) FROM Contact WHERE Status = 0 AND Name_ID = Name.ID) AS StartTime,
(SELECT Max(Date) FROM Contact WHERE Status = 1 AND Name_ID = Name.ID) AS EndTime
FROM Name

Men må jeg ikke foreslå at du bruger nogle andre navne?
Avatar billede ldanielsen Nybegynder
12. april 2006 - 11:04 #2
Name, Date og ID er alle reserverede ord, og skønt de ikke giver fejl nu er de alligevel en potentiel kilde til fejl:

tblName
-------------------------
NameID        strName    |
-------------------------
1        Test    |
2        Test2    |
-------------------------


tblContact
-----------------------------------------
NameID    dtmDate            bStatus    |
-----------------------------------------
1    15-02-2006 15:21    1    |
1    15-02-2006 11:12    1    |
1    15-02-2006 16:45    1    |
1    15-02-2006 09:15    0    |
1    15-02-2006 08:56    0    |
2    15-02-2006 14:21    0    |
1    15-02-2006 13:29    0    |
2    15-02-2006 17:11    1    |
-----------------------------------------
Avatar billede ldanielsen Nybegynder
12. april 2006 - 11:04 #3
Desuden mangler tabellen Contact en primærnøgle
Avatar billede jmp.dk Nybegynder
12. april 2006 - 11:22 #4
Dette er kun et data set jeg har fundet på for at gøre det mere simpelt, I min rigtige database er der primær nøgler og rigtige navne.
Jeg prøver lige din løsning.
Avatar billede ldanielsen Nybegynder
12. april 2006 - 11:53 #5
Det kaldes en SubQuery, og det smarte er at man kan sige Name_ID = Name.ID

Man kan også lave det med et INNER JOIN, hvor man laver en slags virtuelle tabeller og giver dem et alias, her t1 og t2:

SELECT Name, StartTime, EndTime
FROM Name INNER JOIN
(SELECT Name_ID, Min(Date) AS StartTime FROM Contact WHERE Status = 0 GROUP BY Name_ID) t1
ON t1.Name_ID = Name.ID
INNER JOIN
(SELECT Name_ID, Max(Date) AS EndTime FROM Contact WHERE Status = 1 GROUP BY Name_ID) t2
ON t2.Name_ID = Name.ID
Avatar billede jmp.dk Nybegynder
12. april 2006 - 12:04 #6
Tak, det virker perfekt,
Hvilken af de to løsninger vil du sige performer bedst?
Send et svar og du får alle point.
Avatar billede ldanielsen Nybegynder
12. april 2006 - 13:14 #7
Selv tak.

Jeg ved det ikke, jeg tror ikke der er den store forskel i performance. Jeg ville gætte på at den første performer bedst.
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