gpt4 book ai didi

php - 用于从多对多关系返回值的 SQL

转载 作者:行者123 更新时间:2023-11-29 10:22:26 26 4
gpt4 key购买 nike

当 SQL 语句中有多个关键字时,我在尝试通过 PHP 从 MySQL 数据库检索数据时陷入困境。我的专业知识主要集中在前端,因此要实现这一点相当困难。

我有一个屏幕,我想在其中显示几种技能(这些是关键字),所有这些技能都是从数据库中的单个表中检索的。当用户选择一个或多个技能并单击链接时,我想返回所选技能的映射项目,所有这些都通过正确的后端查询(即我的另一个选项是将所有数据返回到前端并使用 JS根据需要进行过滤,但不知何故,我目前没有发现这对于我当前的情况来说是最佳的)

我有一个名为 web_projects 的 MySQL 表,其中列出了几个项目,其中包含 project_idproject_name 等列

另一个名为web_skills的表列出了一些技能,其中包含skill_idskill_name等列

由于存在多对多关系(每个项目可以有多个技能,每个技能可以包含在多个项目中),我有第三个表来管理这种关系。此表 web_project_skills 有 3 列 idproject_idskill_id

视觉 View ,带有映射:

enter image description here

[请不要介意数据类型,它只是创建的快速表,稍后会进行修改]

我通过以下方式发布应用程序中的数据:

http://localhost/am/get.php?q=getprojectsforskill&skill=HTML5

并检索字符串:

$q = trim($_GET["skill"]);

以下 SQL(这是一项研究成果)帮助我获取此请求的值,并且运行良好:

$st = "SELECT web_projects.* 
FROM web_projects
JOIN web_project_skills
ON web_projects.project_id=web_project_skills.project_id
WHERE web_project_skills.skill_id =
(SELECT web_skills.skill_id
FROM web_skills
WHERE web_skills.skill_name = '".$q."'
)";

现在我的发布方法已更改,我得到一个空格分隔的字符串,例如:

http://localhost/am/get.php?q=getprojectsforskill&skill=HTML5%2CCSS3

我的查询现在包括:

$q = trim($_GET["skill"]);
$pieces = explode(",", $q);

$subQuery = "SELECT web_skills.skill_id
FROM web_skills
WHERE web_skills.skill_name = '$pieces[0]'";

if(count($pieces)>1){
for($i=1;$i<count($pieces);$i++){
$subQuery.=" OR web_skills.skill_name = '$pieces[$i]' ";
}
}
$st = "SELECT web_projects.*
FROM web_projects
JOIN web_project_skills
ON web_projects.project_id=web_project_skills.project_id
WHERE web_project_skills.skill_id = ($subQuery)";

对于具有单个值的请求,它可以正常工作,因为没有通过 for 循环添加 SQL 语句。

但是对于多个请求,我会收到错误。示例 URL(同上):

http://localhost/am/get.php?q=getprojectsforskill&skill=HTML5%2CCSS3

我在 subQuery 变量中尝试进行 3 条语句更改时遇到的错误:

 $subQuery.=" OR web_skills.skill_name = '$pieces[$i]' ";

以上语句返回错误:发生错误! SQLSTATE[21000]:基数违规:1242 子查询返回超过 1 行

$subQuery.=" UNION WHERE web_skills.skill_name='$pieces[$i]' ";

以上语句返回错误:发生错误! SQLSTATE[42000]: 语法错误或访问冲突: 1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 7 行“WHERE web_skills.skill_name='CSS3' )”附近使用的正确语法

 $subQuery.=" AND web_skills.skill_name = '$pieces[$i]' ";

以上语句返回一个空数组

最佳答案

您不需要为此使用子查询,只需添加另一个联接即可。

SELECT web_projects.* 
FROM web_projects
JOIN web_project_skills
ON web_projects.project_id=web_project_skills.project_id
JOIN web_skills
ON web_skills.skill_id=web_project_skills.skill_id
WHERE skill_name = '".$q."'

这应该返回与给定技能相关的所有项目。

关于php - 用于从多对多关系返回值的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com