webForumDet fria alternativet

För många poster vi join

10 svar · 214 visningar · startad av juventus1

juventus1Medlem sedan dec. 2000399 inlägg
#1

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
#2
select id,name,(select max(dateOfMeeting) from meeting
where personid = p.personid) as lastMeatDate
from persons as p
order by 3 desc
juventus1Medlem sedan dec. 2000399 inlägg
#3

Fungerar perfekt!

juventus1Medlem sedan dec. 2000399 inlägg
#4

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
#5

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

juventus1Medlem sedan dec. 2000399 inlägg
#6

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
#7

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
juventus1Medlem sedan dec. 2000399 inlägg
#8

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
#9

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?

juventus1Medlem sedan dec. 2000399 inlägg
#10

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.

juventus1Medlem sedan dec. 2000399 inlägg
#11

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!

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)