Приведенный ниже запрос отлично работает, если телефон пользователя поддерживает sqlite версии 3.25.0 или выше. В противном случае, как вы понимаете, запрос не сработает. Как я могу преобразовать код без использования функции row_number ()?

SELECT *
FROM
    (
        SELECT
            ROW_NUMBER() OVER (PARTITION BY recipe_name) AS rn,
            rt.*
        FROM
            SyncRecipeIngredientTable sr
            JOIN RecipeIngredientTable ri ON ri.recipe_ingredient_id = sr.recipe_ingredient_id
            JOIN RecipeTable rt ON rt.recipe_id = sr.recipe_id
        WHERE ri.recipe_item_name in ("patates", "soğan", "su")
        GROUP by rt.recipe_id
        HAVING COUNT(*) >= 3
    )
WHERE rn = 1

Диаграмма ER базы данных: введите описание изображения здесь

Ожидаемый результат: введите описание изображения здесь

-1
RexLudus 21 Фев 2021 в 23:16

1 ответ

Лучший ответ

Я ожидаю, что у рецептов будут уникальные имена. Если да, то внешний запрос просто не нужен:

SELECT rt.*
FROM SyncRecipeIngredientTable sr JOIN
     RecipeIngredientTable ri 
     ON ri.recipe_ingredient_id = sr.recipe_ingredient_id JOIN
     RecipeTable rt
     ON rt.recipe_id = sr.recipe_id
WHERE ri.recipe_item_name in ('patates', 'soğan', 'su')
GROUP by rt.recipe_id
HAVING COUNT(*) >= 3;

Если рецепты могут иметь повторяющиеся имена, можно использовать коррелированный подзапрос:

WITH rt AS (
      SELECT rt.*
      FROM SyncRecipeIngredientTable sr JOIN
           RecipeIngredientTable ri 
           ON ri.recipe_ingredient_id = sr.recipe_ingredient_id JOIN
           RecipeTable rt
           ON rt.recipe_id = sr.recipe_id
      WHERE ri.recipe_item_name in ('patates', 'soğan', 'su')
      GROUP by rt.recipe_id
      HAVING COUNT(*) >= 3
     )
SELECT rt.*
FROM rt
WHERE rt.recipe_id = (SELECT MAX(rt2.recipe_id)
                      FROM rt rt2
                      WHERE rt2.recipe_name = rt.recipe_name
                     );
1
Gordon Linoff 21 Фев 2021 в 20:52