/ / Načítať MAX časovú pečiatku z dotazu - mysql, sql

Načítať časovú značku MAX z dotazu - mysql, sql

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ď č. 1

Jedný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