关于 SQL 的一点点
您的Matieres 表和Resultat 表之间似乎存在one-many 关系?
当您在这种情况下使用SELECT...JOIN 语句时,您实际上返回Matieres 的次数与Resultat 中的匹配次数一样多。
例如:
- 假设你有技能/技能
can touch toes
- 假设
Resultat 中有 5 记录,用于具有该技能的 users
使用您当前的查询结构,您可以执行以下操作:
__SQL:
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat ON Matieres.id = Result.ID_SKILL
__RESULTS:
Resultat.ID_USER Matieres.Nom Resultat.RESULTAT
1 can touch toes 50
2 can touch toes 71
3 can touch toes 23
4 can touch toes 88
5 can touch toes 20
要更改此行为,您需要在 ON 子句中指定其他条件:
__SQL:
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
AND Resultat.ID_USER = 1
__RESULTS:
Resultat.ID_USER Matieres.Nom Resultat.RESULTAT
1 can touch toes 50
PHP while statement echoes duplicates :在此处查看答案以获取更多信息和示例
ON 不是 WHERE
附加条件必须进入ON 子句而不是WHERE 子句的原因是,您希望获得每个Active 技能/材料,无论是否有人已经获得了Resultat。
如果我们将其放入 WHERE 子句中,我们会得到:
__SQL:
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
WHERE Resultat.ID_USER = 1
__RESULTS:
Resultat.ID_USER Matieres.Nom Resultat.RESULTAT
1 can touch toes 50
这似乎没问题,除非您考虑到您拥有多种技能/材料并且用户没有每个技能/材料的记录...例如:
__TABLES
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes 1 111 54
112 can handstand 1 112 60
113 can cartwheel 2 113 72
.
__SQL[1]: {For ID_USER == 1; using ON}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
AND Resultat.ID_USER = 1
__RESULT[1]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes 1 111 54
112 can handstand 1 112 60
113 can cartwheel NULL NULL NULL
__SQL[2]: {For ID_USER == 2; using ON}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
AND Resultat.ID_USER = 2
__RESULT [2]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes NULL NULL NULL
112 can handstand NULL NULL NULL
113 can cartwheel 2 113 72
__SQL[3]: {For ID_USER == 1; using WHERE}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
WHERE Resultat.ID_USER = 1
__RESULT[3]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes 1 111 54
112 can handstand 1 112 60
__SQL[4]: {For ID_USER == 2; using WHERE}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
WHERE Resultat.ID_USER = 2
__RESULT[4]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
113 can cartwheel 2 113 72
你的问题
假设
- 您有一个
user 登录到$_SESSION["id"] == Resultat.ID_USER 所在的网站
- 你想
SELECT all Matieres.id && Matieres.Nom AND Resultat.RESULTAT 已经为该Resultat.ID_USER记录的任何技能
- 您正在使用
PDO 和$bdd 是您与数据库的连接
示例代码
// SQL statement using `?` as a placeholder for the users id (from $_SESSION["id"]
// Add: "AND Resultats.ID_USER = ?" to ON clause to limit joined records to currently logged in user
$sql = "
SELECT Matieres.id, Matieres.nom, Resultats.RESULTAT
FROM Skills
LEFT JOIN Resultats ON Matieres.id = Resultats.ID_MATIERE AND Resultats.ID_USER = ?
WHERE Matieres.Active = TRUE
";
$req = $bdd->prepare($sql); // Prepare query
$req->execute([ $_SESSION["id"] ]); // Assign value to place holder and execute query
$skills = [];
while( $data = $req->fetch() ) {
$skills[] = [
"id"=>$data["id"],
"Nom"=>$data["Nom"],
"RESULTAT"=>$data["RESULTAT"]
];
}
function setWidgetValue( $skill ) {
// Set values outside of "widget" string for ease of reading
$value = ( is_null($skill["RESULTAT"]) ) ? 0 : $skill["RESULTAT"]; // Shorthand if statement using the ternary operator
$nom = $skill["Nom"];
$skill_id = $skill["id"];
$user_id = $_SESSION["id"];
// I've separated the code over several lines to make
// it easier to read you can of course change it back!
$widget = "
<div class='m-5'>
<p>{$nom}</p>
<input
type='range'
value='{$value}'
class='form-control-range'
min='0' step='1' max='10'
id='{$skill_id}'
name='valSkill'
onchange=\"MAJ_Value( {$skill_id}, this.value, {$user_id}
)\" >
</div>
";
return $widget;
}
function setAllWidgetValue( $skills ) {
$widget = "<div id='valSkills' >\n";
foreach( $skills as $skill )
$widget .= setWidgetValue( $skill );
$widget .= "</div>";
return $widget;
}