Hej!
Jag har stött på lite problem. Jag har två tabeller:
Persons
-------
ID
....
Name
och
Meeting
----------
ID
DateOfMeeting
....
PersonID
Jag vill visa alla personer ordnade efter när de senast var med på ett möte. Frågan jag har just nu (Access, som synes):
SELECT Person.Name, Meeting.ID, Meeting.DateOfMeeting
FROM Persons INNER JOIN Meeting ON Meeting.PersonID=Persons.ID
WHERE Meeting.DateOfMeeting=#12/3/2002#
ORDER BY Meeting.DateOfMeeting DESC;
Problemet är att en person kan förekomma flera gånger i varje möte och att en person kan förekomma en massa gånger i mötestabellen om man tittar bakåt. Därför ger frågan många fler poster än personer. Jag vill endast ha lika många poster som antal personer ordnade efter deras senaste mötesbesök. Är det någon som vet hur jag ska göra?
LarsGMedlem sedan dec. 200012 464 inlägg select id,name,(select max(dateOfMeeting) from meeting
where personid = p.personid) as lastMeatDate
from persons as p
order by 3 desc
Det verkar inte fungera så bra trots allt. Har hunnit testa lite nu. Nu ser frågan ut så här:
SELECT p.ID, p.Name, (SELECT MAX(dateOfMeeting) FROM
Meeting WHERE personID = p.ID) AS lastMeetingDate
FROM Persons AS p
ORDER BY 3 DESC;
Men problemet är att den inte sorterar ordentligt. Resultatet kan se ut så här:
ID ... lastMeetingDate
13 2002-12-03
12 2002-12-03
11 2002-12-10
10 2002-12-03
Förstår inte riktigt varför det blir så. Är det någon som vet vad det beror på?
LarsGMedlem sedan dec. 200012 464 inlägg Nej, det ser ju skumt ut. Blir sorteringen på någon annan kolumn eller är det bara osorterat?
3:an står för tredje kolumn så om du har lagt till fler kolumner i select-listan så måste du ändra den också.
Det verkar som sorteringen sker efter första kolumnen. Att sortera efter 1:a eller 3:e kolumnen ger konstigt nog samma resultat. Väljer jag däremot att sortera efter 2:a kolumnen (namn) blir det rätt. Det gör att jag funderar på om sub-frågan är riktig. Vet du vad det kan bero på?
LarsGMedlem sedan dec. 200012 464 inlägg I och med att du får rätt resultat så är nog sub-frågan riktig. Det kanske går bättre om du skriver så här
select p.id,p.name,max(dateOfMeeting) as lastMeetingDate
from person p left outer join meeting m
on p.id = m.personid
group by p.id,p.name
order by 3 desc
När jag klistar in frågan direkt i access vill den ha ett värde på m.personid. Oavsettt vilket id man ger den så blir resultatet:
ID ... lastMeetingDate
Valfritt 2002-12-26
Datumet är maxdatumet. Men man får det oavsett när personen egentligen senast var med.
LarsGMedlem sedan dec. 200012 464 inlägg Stämmer den tabelldefinition som du visade i början av tråden? Där har du persons men du använder person i select-satsen. Hur är det egentligen?
Det står fel i första inlägget, det skall stå Persons och inte Person. Jag gjorde två nya tabeller (utan en massa onödiga kolumner och data i) och testade den senaste frågan du postade och den verkar fungera. Ska testa lite till och kolla vad felet var i den andra databasen.
Jag hittade felet nu. Jag hade av någon anledning ett annat namn personid i den ursprungliga databasen. Det var därför den ville ha ett värde på personid. Tycker det är lite konstigt att jag inte fick syntaxfel för det. Nu fungerar det iaf fint. Tack så mycket för hjälpen!