我需要帮助为以下场景编写 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 查询来实现此目的?谢谢!
如果您有特定的用户 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);
这种方法更加灵活和动态。