Найти самую последнюю запись из отношения "имеет один сквозной" - PullRequest
0 голосов
/ 11 июня 2018

У меня есть следующие таблицы:

  • matrices - имя матрицы и некоторые другие метаданные.
  • matrix_values - хранит различные точки данных 2D-матрицы в видеСтолбец значения JSON (Postgres).Также FK matrix_id для ассоциации с принадлежностью.
  • products - matrix_value может быть присоединен к product через таблицу соединения matrix_value_products
    • matrix_values МОЖЕТ быть связано только с одним product, но не обязательно;на самом деле, большинство не так.Именно поэтому используется таблица соединения вместо отношения FK, принадлежащего, чтобы избежать наличия в столбце FK в основном значений NULL

ERD выглядит как

enter image description here

Каждая матрица имеет несколько matrix_values, где либо A) ни одна из них не связана с product или B) все они связаны с продуктом (возможно, с разными продуктами).

В сценарии A несколько записей представляют собой историю двумерной матрицы, где самая последняя созданная запись имеет видтекущее представление.Мне легко найти этот сценарий matrix_value.

Как мне создать запрос для сценария B , чтобы найти самую последнюю matrix_values запись за продукт ?Для матрицы 777 ниже я хочу вернуть matrix_values записи 2 (самые последние для продукта P ) и 4 (самые последние для продукта Q).

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вы не указали СУБД , поэтому я бы использовал subquery, что является ANSI SQL.

select p.*, mv.*
from matrix_value_products mvp inner join 
     products p
     on p.id = mvp.product_id inner join
     matrix_values mv
     on mv.id = mvp.matrix_value_id
where mv.id = (select max(mvp1.matrix_value_id)
               from matrix_value_products mvp1
               where mvp1.product_id = mvp.product_id
               );
0 голосов
/ 11 июня 2018
SELECT finalValues.* FROM
matrix_values AS finalValues
INNER JOIN matrix_value_products AS finalProducts 
ON finalProducts.matrix_value_id = finalValues.id
AND finalValues.created_at = (
    SELECT max(created_at) 
    FROM matrix_values 
    INNER JOIN matrix_value_products
    ON matrix_values.id = matrix_value_products.matrix_value_id
    WHERE matrix_value_products.product_id = finalProducts.product_id
)   
WHERE
        matrix_id = 777

По сути, вы объединяете две таблицы и ограничиваете их значениями матрицы соответствующей матрицы.Затем вы ограничиваете весь Thing подзапросом, который возвращает только самую последнюю (таким образом, макс., Насколько я понимаю, запись create_at является полем datetime (2)).Вы должны использовать то же самое внутреннее соединение, что и только для того, чтобы ограничить его продуктами, связанными со значениями матрицы, которые вы хотите в итоге получить.

...