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

MySQL подзаявка - Намерете само първия запис в LEFT JOIN

Това е greatest-n-per-group проблем, който се задава често при препълване на стека.

Ето как бих го решил във вашия сценарий:

SELECT m.memberid, m.membername, m.gender, mp.phone, mh.loggedtime, mh.ipaddy
FROM tbl_members m 
INNER JOIN tbl_members_phones mp ON m.defaultphoneid = mp.phoneid
INNER JOIN tbl_members_addresses ma ON m.defaultaddressid = ma.addressid
LEFT OUTER JOIN tbl_members_login_history mh ON m.memberid = mh.memberid
LEFT OUTER JOIN tbl_members_login_history mh2 ON m.memberid = mh2.memberid
    AND mh.pk < mh2.pk
WHERE mh2.pk IS NULL;

Тоест искаме mh да бъде най-новият ред в tbl_member_login_history за дадения memberid. Така че търсим друг ред mh2 това е още по-скоро. Ако не е по-скоро от mh е намерен ред, след което mh2.* ще бъде NULL, така че mh трябва да е най-новата.

Предполагам, че тази таблица има колона с първичен ключ, която съдържа нарастващи стойности. За този пример предполагам, че името на колоната е pk .

Използване на LEFT OUTER JOIN за и двете препратките към таблицата с историята на влизане означават, че m ред ще бъде докладван, дори ако няма съответстващ ред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се свържете с база данни с помощта на Sequel Pro

  2. Обвързване на променлив параметър/резултат с подготвени оператори

  3. Копирайте Microsoft SQL в други бази данни

  4. Синтактична грешка поради използването на запазена дума като име на таблица или колона в MySQL

  5. Как да добавя към всеки ред в MySQL?