Mysql
 sql >> база данни >  >> RDS >> Mysql

Изпълнение на множество заявки в MySQL без използване на подзаявка

Не работи както си мислите, че трябва и документацията обяснява значението на 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 вместо. Индексите на числовите колони са по-бързи и използват по-малко място от индексите на колоните с низове.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на масив от MySQL таблица

  2. Вмъкване и избор на UUID като двоични (16)

  3. ПОРЪЧАЙТЕ първо по азбука, след това по номер

  4. Търсене по няколко ключови думи

  5. Възможно ли е SQL да намери записи с дубликати?