mysql - 将 SQL WHERE 查询转换为 JOIN
问题描述
我需要帮助将此 WHERE 查询转换为 JOIN。对于其他查询,我将遵循相同的模式。谢谢你。
$query = "SELECT DISTINCT r.recipe_id, r.recipe_name, r.recipe_image,
r.recipe_duration, r.recipe_serving, r.recipe_difficulty,
(SELECT category_name
FROM tbl_category
WHERE r.category_id = category_id) AS category_name,
(SELECT cuisine_name
FROM tbl_cuisine
WHERE r.cuisine_id = cuisine_id) AS cuisine_name,
r.recipe_ingredients, r.recipe_steps, r.date, r.user_id,
u.fname, u.lname, u.image, r.language
FROM tbl_recipe r, tbl_user u
WHERE r.category_id like '%{$category_name}%'
AND u.id = r.user_id
AND r.language = '$language'
GROUP BY r.recipe_id
ORDER BY r.recipe_id ASC";
解决方案
在大多数情况下,您只需将逗号分隔的表更改为 JOIN 子句。连接的“ON”子句来自 WHERE 子句
SELECT DISTINCT
r.recipe_id,
r.recipe_name,
r.recipe_image,
r.recipe_duration,
r.recipe_serving,
r.recipe_difficulty,
(SELECT category_name
FROM tbl_category
WHERE r.category_id = category_id) AS category_name,
(SELECT cuisine_name
FROM tbl_cuisine
WHERE r.cuisine_id = cuisine_id) AS cuisine_name,
r.recipe_ingredients,
r.recipe_steps,
r.date,
r.user_id,
u.fname,
u.lname,
u.image,
r.language
FROM
tbl_recipe r
JOIN tbl_user u
on r.user_id = u.id
WHERE
r.category_id like '%{$category_name}%'
AND r.language = '$language'
GROUP BY
r.recipe_id
ORDER BY
r.recipe_id ASC
此外,除了基于列的选择之外,您还可以拉出类别和加入的美食。比查询每条记录更高效
SELECT DISTINCT
r.recipe_id,
r.recipe_name,
r.recipe_image,
r.recipe_duration,
r.recipe_serving,
r.recipe_difficulty,
cat.category_name,
cn.cuisine_name,
r.recipe_ingredients,
r.recipe_steps,
r.date,
r.user_id,
u.fname,
u.lname,
u.image,
r.language
FROM
tbl_recipe r
JOIN tbl_user u
on r.user_id = u.id
JOIN tbl_category cat
on r.category_id = cat.category_id
JOIN cuisine_name cn
on r.cuisine_id = cn.cuisine_id
WHERE
r.category_id like '%{$category_name}%'
AND r.language = '$language'
GROUP BY
r.recipe_id
ORDER BY
r.recipe_id ASC
另请注意,从左到右,我的“加入/开启”条件列出了左表/别名 = 我要加入的 TO 表/别名。有助于保持从这里到那里连接表格的方向意识。
此外,正如其他人在评论中指出的那样,您对 SQL 注入持开放态度,并且应该始终参数化您的查询并清理您的输入源值......因此也要研究 SQL 注入和数据清理。
推荐阅读
- javascript - 我需要帮助来制作右、左和中间文本
- javascript - javaScript JSON localstorage,用户输入,只保存第一个条目
- google-chrome - WebRTC:Chrome 只显示第一个视频轨道
- anylogic - Anylogic:使用表格函数的时间依赖库存流入
- r - 在新窗口中打开动画情节
- mysql - 返回一行时子查询返回多行错误
- r - R-X 轴显示中的并排条形图
- symfony - 组合 ManyToOne 和 OneToOne 时的 Doctrine Bug:删除时的 ForeignKeyConstraintViolationException
- amazon-web-services - AWS ECS 容器环境变量 terraform
- python - 熊猫如何通过运行范围添加组列