#mysql #mariadb #left-join
Вопрос:
Следующий запрос должен возвращать самые новые макеты для всех магазинов, которые новее текущей календарной недели (year_week):
SELECT
year_weeks.id,
year_weeks.week,
`frame_group_layouts`.`id` AS fgl_id
FROM `year_weeks`
LEFT JOIN `frame_group_layouts` ON `frame_group_layouts`.`id` IN (
SELECT FIRST_VALUE(`frame_group_layouts`.`id`) OVER(
PARTITION BY store_id
ORDER BY year_week_id DESC
)
FROM
frame_group_layouts
WHERE
year_week_id <= year_weeks.id
AND edit_of_id IS NULL
AND frame_group_layout_type = 'template'
)
WHERE `year_weeks`.`year` = 2021
Ожидаемым результатом будет Список со всеми календарными неделями на 2021 год, с:
- fgl_id равен НУЛЮ, если нет магазина с макетом старше или равным текущей неделе
- fgl_id, установленный с макетом
Фактический результат заключается в следующем:
-------- ------ ------
| id | week | id |
-------- ------ ------
| 202101 | 1 | NULL |
| 202102 | 2 | NULL |
| 202103 | 3 | NULL |
| 202104 | 4 | NULL |
| 202105 | 5 | NULL |
| 202106 | 6 | NULL |
| 202107 | 7 | NULL |
| 202108 | 8 | NULL |
| 202109 | 9 | NULL |
| 202110 | 10 | NULL |
| 202111 | 11 | NULL |
| 202112 | 12 | NULL |
| 202113 | 13 | NULL |
...
даже если макет существует.
Если я установлю year_week.идентификатор в предложении WHERE подзапроса вручную, запрос возвращает правильный результат (но только для данной недели):
MariaDB [denner_xpt_core]> SELECT
-> year_weeks.id,
-> year_weeks.week,
-> `frame_group_layouts`.`id`
-> FROM `year_weeks`
-> LEFT JOIN `frame_group_layouts` ON `frame_group_layouts`.`id` IN (
-> SELECT FIRST_VALUE(`frame_group_layouts`.`id`) OVER(
-> PARTITION BY store_id
-> ORDER BY year_week_id DESC
-> )
-> FROM
-> frame_group_layouts
-> WHERE
HERE-> year_week_id <= 202135
-> AND edit_of_id IS NULL
-> AND frame_group_layout_type = 'template'
-> )
-> WHERE `year_weeks`.`year` = 2021;
-------- ------ -------
| id | week | id |
-------- ------ -------
| 202101 | 1 | 11136 |
| 202102 | 2 | 11136 |
| 202103 | 3 | 11136 |
| 202104 | 4 | 11136 |
| 202105 | 5 | 11136 |
| 202106 | 6 | 11136 |
| 202107 | 7 | 11136 |
| 202108 | 8 | 11136 |
| 202109 | 9 | 11136 |
| 202110 | 10 | 11136 |
| 202111 | 11 | 11136 |
| 202112 | 12 | 11136 |
| 202113 | 13 | 11136 |
| 202114 | 14 | 11136 |
| 202115 | 15 | 11136 |
| 202116 | 16 | 11136 |
| 202117 | 17 | 11136 |
| 202118 | 18 | 11136 |
| 202119 | 19 | 11136 |
| 202120 | 20 | 11136 |
| 202121 | 21 | 11136 |
| 202122 | 22 | 11136 |
| 202123 | 23 | 11136 |
| 202124 | 24 | 11136 |
| 202125 | 25 | 11136 |
| 202126 | 26 | 11136 |
| 202127 | 27 | 11136 |
| 202128 | 28 | 11136 |
| 202129 | 29 | 11136 |
| 202130 | 30 | 11136 |
| 202131 | 31 | 11136 |
| 202132 | 32 | 11136 |
| 202133 | 33 | 11136 |
| 202134 | 34 | 11136 |
| 202135 | 35 | 11136 |
| 202136 | 36 | 11136 |
| 202137 | 37 | 11136 |
| 202138 | 38 | 11136 |
| 202139 | 39 | 11136 |
| 202140 | 40 | 11136 |
| 202141 | 41 | 11136 |
| 202142 | 42 | 11136 |
| 202143 | 43 | 11136 |
| 202144 | 44 | 11136 |
| 202145 | 45 | 11136 |
| 202146 | 46 | 11136 |
| 202147 | 47 | 11136 |
| 202148 | 48 | 11136 |
| 202149 | 49 | 11136 |
| 202150 | 50 | 11136 |
| 202151 | 51 | 11136 |
| 202152 | 52 | 11136 |
| 202101 | 1 | 11138 |
| 202102 | 2 | 11138 |
| 202103 | 3 | 11138 |
| 202104 | 4 | 11138 |
| 202105 | 5 | 11138 |
| 202106 | 6 | 11138 |
| 202107 | 7 | 11138 |
| 202108 | 8 | 11138 |
| 202109 | 9 | 11138 |
| 202110 | 10 | 11138 |
| 202111 | 11 | 11138 |
| 202112 | 12 | 11138 |
| 202113 | 13 | 11138 |
| 202114 | 14 | 11138 |
| 202115 | 15 | 11138 |
| 202116 | 16 | 11138 |
| 202117 | 17 | 11138 |
| 202118 | 18 | 11138 |
| 202119 | 19 | 11138 |
| 202120 | 20 | 11138 |
| 202121 | 21 | 11138 |
| 202122 | 22 | 11138 |
| 202123 | 23 | 11138 |
| 202124 | 24 | 11138 |
| 202125 | 25 | 11138 |
| 202126 | 26 | 11138 |
| 202127 | 27 | 11138 |
| 202128 | 28 | 11138 |
| 202129 | 29 | 11138 |
| 202130 | 30 | 11138 |
| 202131 | 31 | 11138 |
| 202132 | 32 | 11138 |
| 202133 | 33 | 11138 |
| 202134 | 34 | 11138 |
| 202135 | 35 | 11138 |
| 202136 | 36 | 11138 |
| 202137 | 37 | 11138 |
| 202138 | 38 | 11138 |
| 202139 | 39 | 11138 |
| 202140 | 40 | 11138 |
| 202141 | 41 | 11138 |
| 202142 | 42 | 11138 |
| 202143 | 43 | 11138 |
| 202144 | 44 | 11138 |
| 202145 | 45 | 11138 |
| 202146 | 46 | 11138 |
| 202147 | 47 | 11138 |
| 202148 | 48 | 11138 |
| 202149 | 49 | 11138 |
| 202150 | 50 | 11138 |
| 202151 | 51 | 11138 |
| 202152 | 52 | 11138 |
-------- ------ -------
104 rows in set (0.001 sec)
Вы можете попробовать это здесь: https://dbfiddle.uk/?rdbms=mariadb_10.4amp;fiddle=5271cb1f0117974a364f51a88e1a197c
Что я делаю не так?