Skip to content

Instantly share code, notes, and snippets.

@meeDamian
Created May 4, 2012 12:25
Show Gist options
  • Save meeDamian/2594514 to your computer and use it in GitHub Desktop.
Save meeDamian/2594514 to your computer and use it in GitHub Desktop.
[ MySQL | bugs ] Wyciąganie najnowszego rekordu z bazy danych
-- tabela
CREATE TABLE winners(
id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
cid BIGINT UNSIGNED NOT NULL, -- Contest ID - id konkursu
eid BIGINT UNSIGNED NOT NULL, -- Entry ID - id wpisu w tym konkursie
place INT NOT NULL, -- którym miejscem został oznaczony przez moderatora
uts DECIMAL(17,3) NOT NULL,
PRIMARY KEY(id)
);
-- TODO: wyciągnij wszystkie najnowsze wpisy (uts to timestamp, używam decimal, bo mysql nie rozumie milisekund...)
-- każdy konkurs składa się z wpisów, moderator może dowolnie modyfikować miejsce, a każdą zmianę notuję
-- muszę wyciągnąć tylko najnowsze (z największym uts) wpisy dla kombinacji cid+eid
-- jak teoretycznie powinno działać:
SELECT eid, place, max(uts) FROM winners WHERE cid=22 GROUP BY eid;
-- Q: czemu nie działa?
-- A: bo mysql jest głupie i nawet gdy w wyniku zwróci poprawny (największy) uts, to pozostałe dane są pierwszymi jakie wystapiły w tabeli (nie pasują rzędem do uts)...
-- aktualne rozwiązanie:
SELECT * FROM winners w WHERE uts IN (SELECT MAX(uts) FROM winners WHERE cid=22 GROUP BY eid) AND place!=0 AND cid=22 ORDER BY place;
-- Q: dlaczego ejst chujowe?
-- A: bo zadziała tylko dla unikalnych timestampów, które przy większym ruchu wcale nie muszą być unikalne
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment