wybieranie tylko najnowszego rekordu lub niewybieranie żadnego w zależności od parametru

0
person | borrow_date  | is_borrowed | SN | date        | id
1      | 2019-01-10...| 1           | 20 |2019-01-10...| 6
3      | 2019-01-09...| 3           | 10 |2019-01-09...| 5
1      | 2019-01-08...| 1           | 10 |2019-01-08...| 4
2      | 2019-01-08...| 1           | 10 |2019-01-08...| 3
1      | NULL         | 2           | 20 |2019-01-07...| 2
1      | NULL         | 2           | 10 |2019-01-07...| 1

Mam taką przykładową bazę. Chcę wybrać tylko rekordy dla konkretnej osoby pokazywało wszystkie SN dla których dana wartość is_borrowed =1. Po is_borrowed może pojawić się 3.

Tablica to swego rodzaju wypożyczalnia.
Jednak tutaj osoby mogą przekazywać rzeczy między sobą.
Rzeczy rozpoznawane są po numerze SN (po prostu Serial Number).
is_borrowed ma trzy różne wartości: 1-wypożyczono, 2-zwrócono, 3-jakaś osoba poprosiła aktualnego posiadacza rzeczy o przekazania jej tej rzeczy.
Zapytanie ma więc pokazać wszystkie rzeczy, których aktualnym właścicielem jest dana osoba.

Niestety za żadne skarby nie mogę uzyskać oczekiwanego wyniku, takiego jak niżej
Dla osoby pierwszej:

person | borrow_date  | is_borrowed | SN | date         |id
1      | 2019-01-10...| 1           | 20 | 2019-01-10...|6
1      | 2019-01-08...| 1           | 10 | 2019-01-08...|4

Dla drugiej:

empty set

Dla trzeciej:

empty set
0

Nie ma tu nic o dacie

0

Nie wiem czy taki zapis jest wspierany przez MySQL, ale może coś takiego:

SELECT
  *
FROM borrows b
WHERE b.person = <id>
  AND is_borrowed = 1
  AND borrow_date = MAX(borrow_date) OVER (PARTITION BY sn)

Jeśli to nie zadziała, to można to zrobić poprzez subquery:

SELECT
  *
FROM (
  SELECT
    *,
    MAX(borrow_date) OVER (PARTITION BY sn) AS max_borrow
  FROM borrows
  WHERE person = <id>
    AND is_borrowed = 1
  ) b
WHERE borrow_date = max_borrow
0

jeżeli to mysql w wersji <8 to można tak:

select 
    person
    ,borrow_date
    ,is_borrowed
    ,SN
    ,date
FROM (select 
        *
      ,@lp := IF(@current_sn = sn, @lp + 1, 1) AS lp
      ,@current_sn := sn as csn 
      from 
          tab 
      where 
        is_borrowed = 1
      ORDER BY SN, BORROW_DATE DESC) DT
 WHERE 
   LP =1
   AND PERSON = 1

http://sqlfiddle.com/#!9/2bff097/6

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0