AnkmanMedlem sedan juni 2002116 inlägg Vet att jag läst hur man gör detta men hittar inte lösningen nånstans nu.
Tabellen log innehåller flera poster för varje user_id, jag vill hämta den med högst l.time men vet inte hur.
Nedanstående fråga hämtar den först påträffade raden i log där u.id = l.user_id, dvs den där time är lägst.
SELECT
u.username, u.id, l.page, l.query, l.time
FROM
users u
INNER JOIN
log l
ON
u.id = l.user_id
WHERE
u.online > '2004-08-04 13:54:43'
GROUP BY
u.username, u.id
ORDER BY
u.username
LarsGMedlem sedan dec. 200012 464 inlägg SELECT
u.username, u.id, l.page, l.query, l.time
FROM
users u
INNER JOIN
log l
ON
u.id = l.user_id
WHERE l.time = (select max(time) from log
where log.user_id = l.user_id)
and
u.online > '2004-08-04 13:54:43'
AnkmanMedlem sedan juni 2002116 inlägg Ok, glömde naturligtvis att tala om att det MySql, alltså inga subqueries.
LarsGMedlem sedan dec. 200012 464 inlägg SELECT u.username, u.id, l1.page, l1.query, l1.time
FROM users u INNER JOIN log l1
ON u.id = l1.user_id
inner join log l2 on l1.user_id = l2.user_id
WHERE u.online > '2004-08-04 13:54:43'
group by u.username, u.id, l1.page, l1.query, l1.time
having l1.time = max(l2.time)
AnkmanMedlem sedan juni 2002116 inlägg Frågan ovan ser ut att göra precis det som jag vill, men något (som jag inte hittar) måste vara fel i den. MySql hänger sig eller nåt (tar all CPU i några minuter, inget händer).
AnkmanMedlem sedan juni 2002116 inlägg Ingen som kan se något fel? Har kollat igenom alla fältnamn och så men hittar inget fel. Det är svårt när man inte får något felmeddelande.
Några tips om hur man felsöker en sån här fråga? Det enda jag kunde komma var att köra explain på den, men det säger mig inte så mycket. (Det funkar i alla fall, alltid något).
+-------+--------+---------------+---------+---------+------------+------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+--------+---------------+---------+---------+------------+------+---------------------------------+
| l1 | ALL | NULL | NULL | NULL | NULL | 6962 | Using temporary; Using filesort |
| l2 | ALL | NULL | NULL | NULL | NULL | 6962 | Using where |
| u | eq_ref | PRIMARY | PRIMARY | 4 | l1.user_id | 1 | Using where |
+-------+--------+---------------+---------+---------+------------+------+---------------------------------+
3 rows in set (0.00 sec)
aasahMedlem sedan mars 20034 471 inlägg Jag är inte säker men möjligen:
SELECT u.username, u.id, l1.page, l1.query, l1.time
FROM [b][blue][3]([/3][/blue][/b]users u INNER JOIN log l1
ON u.id = l1.user_id[b][blue][3])[/3][/blue][/b]
inner join log l2 on l1.user_id = l2.user_id
WHERE u.online > '2004-08-04 13:54:43'
group by u.username, u.id, l1.page, l1.query, l1.time
having l1.time = max(l2.time)
AnkmanMedlem sedan juni 2002116 inlägg Tyvärr. Det blir samma skit. Processorn går i topp. Andra förslag?
LarsGMedlem sedan dec. 200012 464 inlägg Du får väl definera index på time, user_id och kanske online då.
AnkmanMedlem sedan juni 2002116 inlägg Det hjälpte inte. När jag kör frågan utan explain så får jag samma resultat som innan, dvs inget.
LarsGMedlem sedan dec. 200012 464 inlägg Vad menar du?
Att du inte får någon respons alls från mysql?
Att du får en tom resultmängd?
Att du får en tom resultmängd och att det tar väldig lång tid att få fram det?
AnkmanMedlem sedan juni 2002116 inlägg Jag får ingen respons alls från MySql.
AnkmanMedlem sedan juni 2002116 inlägg Har fortfarande inte fått ordning på den här SQL-satsen. Samma problem fortfarande, MySql "hänger" sig i några minuter. Det tycks vara något med tabellen users i alla fall, den går inte att komma åt från PhpMyAdmin efter att man kört frågan, däremot går det att komma åt log.
Jag fattar ingenting.