webForumDet fria alternativet

Högsta värdet från join-tabellen

Databaser & SQL

12 svar · 398 visningar · startad av Ankman

Medlem sedan juni 2002116 inlägg
Frågan#1

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
Medlem sedan dec. 200012 464 inlägg
#2
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'
Medlem sedan juni 2002116 inlägg
#3

Ok, glömde naturligtvis att tala om att det MySql, alltså inga subqueries.

Medlem sedan dec. 200012 464 inlägg
#4
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)
Medlem sedan juni 2002116 inlägg
#5

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

Medlem sedan juni 2002116 inlägg
#6

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)
Medlem sedan mars 20034 471 inlägg
#7

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)
Medlem sedan juni 2002116 inlägg
#8

Tyvärr. Det blir samma skit. Processorn går i topp. Andra förslag?

Medlem sedan dec. 200012 464 inlägg
#9

Du får väl definera index på time, user_id och kanske online då.

Medlem sedan juni 2002116 inlägg
#10

Det hjälpte inte. När jag kör frågan utan explain så får jag samma resultat som innan, dvs inget.

Medlem sedan dec. 200012 464 inlägg
#11

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?

Medlem sedan juni 2002116 inlägg
#12

Jag får ingen respons alls från MySql.

Medlem sedan juni 2002116 inlägg
#13

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.

255 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)