如何创建 SQL 视图以在结果集中指示用户最喜欢的食谱?

问题描述 投票:0回答:1

我需要帮助为以下场景编写 SQL VIEW 查询: 这是我尝试过的查询,但它只返回匹配的数据,因为任何人 user_id 都与任何食谱匹配:

CREATE VIEW view_recipebank AS
SELECT
r.*,
IFNULL(f.status, "0") as favourite,
f.user_id as f_user_id,
f.status as f_status,
FROM tbl_recipes as r
LEFT JOIN tbl_favourites as f ON f.type = "recipe" AND f.type_id = r.recipe_id
WHERE
r.status = '1' AND r.is_hide_recipebank = '0'

我有两个表,tbl_recipes 和 tbl_favourites。 tbl_recipes 表存储所有菜谱,用于通过分页向用户显示菜谱。 tbl_favourites 表存储recipe_id 和user_id 来跟踪每个用户标记为他们最喜欢的食谱。

我需要一个 VIEW 查询,它返回所有菜谱以及一个附加列,该列指示每个菜谱是否是特定用户的最爱。如果菜谱是最喜欢的,则该列应返回 1;否则,它应该返回 0。

如何编写 VIEW 查询来实现此目的?谢谢!

php sql mysql mysqli
1个回答
0
投票

如果您有特定的用户 ID,即由于访问查询发生更改,您不需要将其作为参数传递,我会这样做:

CREATE VIEW view_recipebank AS
SELECT
    r.*,
    IFNULL(f.status, "0") AS favourite
FROM
    tbl_recipes AS r
LEFT JOIN
    tbl_favourites AS f
ON
    f.type = "recipe" AND f.type_id = r.recipe_id AND f.user_id = @user_id
WHERE
    r.status = '1' AND r.is_hide_recipebank = '0';

首先,这可能不是一个好主意,您可能希望在查询中使用参数化用户 ID 来过滤特定用户。了解这一点至关重要,因为视图不能接受参数(在本例中为用户 ID),您可能需要在存储过程中使用此视图或从应用程序层生成动态 SQL。

下面是如何创建存储过程来实现此目的的示例,它允许您将用户 ID 作为参数传递:

DELIMITER $$

CREATE PROCEDURE GetRecipeBankByUserId(IN p_user_id INT)
BEGIN
    SELECT
        r.*,
        IFNULL(f.status, "0") AS favourite
    FROM
        tbl_recipes AS r
    LEFT JOIN
        tbl_favourites AS f
    ON
        f.type = "recipe" AND f.type_id = r.recipe_id AND f.user_id = p_user_id
    WHERE
        r.status = '1' AND r.is_hide_recipebank = '0';
END $$

DELIMITER ;

使用这种方法,您可以使用特定的用户 ID 调用此存储过程,如下所示:

CALL GetRecipeBankByUserId(12345);

这种方法更加灵活和动态。

© www.soinside.com 2019 - 2024. All rights reserved.