连接和两个可能的 where 子句


Joins and two possible where clauses

我已经搜索过,但似乎找不到我是如何做到这一点的。 基本上我有两个表,如果这稍微不那么复杂,一个简单的连接就可以了。

我想要达到的是,每个学生选择两个科目,他每周为每个科目获得一定的分数。 然后我希望能够显示学生的姓名,他的科目1,然后是分数,然后是科目2和分数。 通过下面的查询,这显然适用于显示主题 1 中的分数,但我对如何获得主题 2 感到困惑。

$query = "SELECT pupils.name, pupils.subject1, pupils.subject2, subjects.week1 + week2 + week3 AS subject1points 
            FROM pupils, subjects 
            WHERE pupils.subject1 = subjects.subject";
$result = @mysql_query ($query);
if ($result) {
    echo....

也许是某种子查询? 提前谢谢。 然后我当然会完成桌子并显示结果。

您可以加入subjects三次,但您需要为它们设置别名以消除列的歧义:

SELECT 
    pupils.name, 
    pupils.subject1, 
    pupils.subject2,
    pupils.subject3,
    s1.week1 + s1.week2 + s1.week3 AS subject1points,
    s2.week1 + s2.week2 + s2.week3 AS subject2points,
    s3.week1 + s3.week2 + s3.week3 AS subject3points
FROM 
    pupils, subjects s1, subjects s2, subjects s3
WHERE 
    pupils.subject1 = s1.subject
    AND
    pupils.subject2 = s2.subject
    AND
    pupils.subject3 = s3.subject

在上面的查询中,s1s2s3 是别名。定义后,您可以在通常使用完整表名称的任何位置使用它们。

另一种方式,也是我个人的偏好,是使用 JOIN 语法:

SELECT 
    p.name, 
    p.subject1, 
    p.subject2,
    p.subject3,
    s1.week1 + s1.week2 + s1.week3 AS subject1points,
    s2.week1 + s2.week2 + s2.week3 AS subject2points,
    s3.week1 + s3.week2 + s3.week3 AS subject3points
FROM 
    pupils p
JOIN
    subjects s1 ON p.subject1 = s1.subject
JOIN
    subjects s2 ON p.subject2 = s2.subject
JOIN
    subjects s3 ON p.subject3 = s3.subject

在上面的查询中,我还为pupils p 提供了别名。我更喜欢这种语法,因为它非常清楚。如果学生的任何科目可以为空(subject1subject2subject3),那么您可能希望将它们更改为LEFT JOIN s,以便您仍然可以看到任何非空科目的结果。

使用三个连接。 我认为这就是你想要的:

SELECT p.name, p.subject1, (s1.week1 + s1.week2 + s1.week3) as score1,
       p.subject2, (s2.week1 + s2.week2 + s2.week3) as score2,
       p.subject3, (s3.week1 + s3.week2 + s3.week3) as score3
FROM pupils p LEFT JOIN
     subjects s1
     ON p.subject1 = s1.subject LEFT JOIN
     subjects s2
     ON p.subject2 = s2.subject LEFT JOIN
     subjects s3
     ON p.subject3 = s3.subject;

请注意,您应该学习使用正确的显式join语法,尤其是在您不熟悉 SQL 的情况下。 现在是养成好习惯的时候了。

我会进行一个查询,将一个带有 2 个主题表副本的学生表连接起来。

编辑
我不会费心编写我表达的想法,因为其他人已经做到了。但是,只有 2 个科目,而不是 3 个(和 3 周的分数),但这只是意味着将s3排除在外。