Не работи както си мислите, че трябва и документацията обяснява значението на DISTINCT
:става дума за отделниредове :
(източник:http://dev.mysql.com /doc/refman/5.7/en/select.html )
Трябва да групирате редовете по потребител, за да получите по един ред за всеки потребител, но за съжаление не можете да получите последния му резултат по този начин. Можете да получите максималния, минималния, средния резултат и други изчислени стойности. Проверете списъка с GROUP BYкод> агрегатни функции
.
Заявката
Това е заявката, която получава стойностите, от които се нуждаете:
SELECT u.fsname, u.emailaddress, la.score
FROM users u
INNER JOIN attempts la # 'la' from 'last attempt'
ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr # 'mr' from 'more recent' (than last attempt)
ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL
Как работи
Той се присъединява към таблица потребители
(с псевдоним като u
) с таблица опити
(с псевдоним като la
, съкратено от "последен опит") с помощта на emailaddress
като съответстваща колона. Това е присъединяването, което вече имате в заявката си. Добавих псевдонимите, защото те ви помагат да пишете по-малко от този момент нататък.
След това се присъединява към опитите
таблица отново (с псевдоним като mr
от „по-скорошни отколкото последния опит"). Съвпада с всеки опит от la
с всички опити от mr
на същия потребител (идентифициран по техния имейл адрес
)и които имат по-скорошна datetime
. LEFT JOIN
гарантира, че всеки ред от la
съответства на поне един ред от mr
. Редовете от la
които нямат съвпадение в mr
са редовете, които имат най-големите стойности на datetime
за всеки имейл адрес
. Те са съпоставени с редове, пълни с NULL
(за mr
част).
И накрая, WHERE
клаузата запазва само редовете, които имат NULL
в datetime
колона на реда, избран от mr
. Това са редовете, които съответстват на най-новите записи от la
за всяка стойност на emailaddress
.
Забележки за производителността
За да се изпълни бързо тази заявка (всяка заявка! ) се нуждае от индекси на колоните, използвани в JOIN
, КЪДЕ
, ГРУПА ПО
и ПОРЪЧАЙ ПО
клаузи.
Не трябва да използвате emailaddress
в таблица опити
за идентифициране на потребителя. Трябва да имате PK
(първичен ключ) на таблица потребители
и го използвайте като FK
(външен ключ) в таблица опити
(и други таблици, които се отнасят до потребител). Ако имейл адрес
е PK
на таблица потребители
променете го на УНИКАЛЕН ИНДЕКС
и използвайте нов АВТОМАТИЧНО ИНКРЕМЕНТ НА INTEGER
ed колона userId
като PK
вместо. Индексите на числовите колони са по-бързи и използват по-малко място от индексите на колоните с низове.