Mám problém s mojím MySQL dotazom, v súčasnosti mám nasledovné
SELECT DISTINCT
members.userid,
messaging.toName,
members.url,
messaging.timestamp AS utime
FROM
messaging
JOIN members
ON members.userid = messaging.senderid
WHERE (
messaging.userid = "$profileid"
OR messaging.senderid = "1000450"
)
ORDER BY messaging.timestamp DESC
Čo prináša späť
userid
toName
url
timestamp
Vyššie uvedený dotaz prináša všetky rôzne hodnoty časovej značky, ale to, čo potrebujem, je urobiť späť len najnovšiu časovú pečiatku.
napríklad
userid | toName | url | timestamp |
------------------------------------------
Test | Dave | url | 7787263803 |
Test | Dave | url | 7787263804 |
Test | Dave | url | 7787263805 |
Test | Dave | url | 7787263806 |
Ako môžem upraviť dotaz tak, aby priniesol iba časovú značku maxium ako je uvedené nižšie?
userid | toName | url | timestamp |
------------------------------------------
Test | Dave | url | 7787263806 |
Akákoľvek pomoc by bola skvelá
odpovede:
0 pre odpoveď č. 1Jedným zo spôsobov, ako to urobiť, je (pomocou vášho dotazu) obmedziť výstup na 1 riadok, pretože ste už zostupne objednali svoj resultset podľa časovej značky stĺpca.
SELECT DISTINCT
members.userid,
messaging.toName,
members.url,
messaging.timestamp AS utime
FROM
messaging
JOIN members
ON members.userid = messaging.senderid
WHERE (
messaging.userid = "$profileid"
OR messaging.senderid = "1000450"
)
ORDER BY messaging.timestamp DESC
LIMIT 1
Ďalším spôsobom, ako to dosiahnuť, by bolo použitie agregovanej funkcie MAX()
SELECT DISTINCT
members.userid,
messaging.toName,
members.url,
MAX(messaging.timestamp) AS utime
FROM
messaging
JOIN members
ON members.userid = messaging.senderid
WHERE (
messaging.userid = "$profileid"
OR messaging.senderid = "1000450"
)
GROUP BY 1,2,3
-- ORDER BY messaging.timestamp DESC # Unnecessary sorting in this solution
Ktorý bude produkovať maximálnu časovú značku pre každý odlišný pár (userid, toName, url).
Môžete tiež získať rovnaký výsledok pomocou funkcie WINDOW:
SELECT
*
FROM (
SELECT DISTINCT
members.userid,
messaging.toName,
members.url,
messaging.timestamp AS utime,
rank() OVER (ORDER BY messaging.timestamp) AS position
FROM
messaging
JOIN members
ON members.userid = messaging.senderid
WHERE (
messaging.userid = "$profileid"
OR messaging.senderid = "1000450"
)
-- ORDER BY messaging.timestamp DESC # Unnecessary sorting in this solution
) WHERE position = 1
Veľkou výhodou tohto riešenia je, že zmena klauzuly WHERE môžete získať na druhom, treťom ... veľmi rýchlo.
1 pre odpoveď č. 2
stačí pridať LIMIT 1
na konci vášho dotazu
1 pre odpoveď č. 3
Pre návrat 4 stĺpce s max časová pečiatka, u by mal používať group by
prevádzkovateľ a max
pre cieľové pole
SELECT DISTINCT
members.userid,
messaging.toName,
members.url,
max(messaging.timestamp) AS utime
FROM
messaging
JOIN members
ON members.userid = messaging.senderid
WHERE (
messaging.userid = "$profileid"
OR messaging.senderid = "1000450"
)
group by members.userid,
messaging.toName,
members.url
alebo u môžete použiť limit 1
s order by desc
:
SELECT DISTINCT
members.userid,
messaging.toName,
members.url,
max(messaging.timestamp) AS utime
FROM
messaging
JOIN members
ON members.userid = messaging.senderid
WHERE (
messaging.userid = "$profileid"
OR messaging.senderid = "1000450"
)
ORDER BY messaging.timestamp DESC limit 1