Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql真的有问题吗_Mysql - Fatal编程技术网

mysql真的有问题吗

mysql真的有问题吗,mysql,Mysql,我写这个查询是为了获得雇员的名字和姓氏,以及在dno 5的ProtectX上工作超过10小时的雇员的工作时间 select distinct fname, lname, hours from Project left join Employee on dnum = dno left join Works_On on pnumber = pno where dno = 5 and hours > 10 and pname = 'ProductX' group by fname; 但我

我写这个查询是为了获得雇员的名字和姓氏,以及在dno 5的ProtectX上工作超过10小时的雇员的工作时间

select distinct fname, lname, hours
from Project 
left join Employee on dnum = dno 
left join Works_On on pnumber = pno 
where dno = 5 and hours > 10 and pname = 'ProductX' group by fname;
但我的结果毫无意义

 +----------+---------+-------+
 | fname    | lname   | hours |
 +----------+---------+-------+
 | Franklin | Wong    | 32.50 |
 | John     | Smith   | 32.50 |
 | Joyce    | English | 32.50 |
 | Ramesh   | Narayan | 32.50 |
 +----------+---------+-------+

首先,富兰克林甚至不在ProjectX上工作。如果我去掉dno=5,我会得到完全相同的结果,这毫无意义。如果删除pname=ProjectX,则相同。若富兰克林不遵守where条款,他究竟为什么会在那个里?还有,时间都一样是怎么回事?这个数字应该只显示给约翰·史密斯,但它会显示给他们所有人吗

您可以从
项目
中选择所有行,而不管它们的
pno
。因为(我猜)
pname
Work\u on
表的一列,所以它会过滤掉正在
左连接的部分,而不是您选择的主表

因此,只需在
pno
列中进行筛选(如果该列是
项目的一列)。

这应该可以:

select distinct p.fname, p.lname, w.hours
from Project p
join Employee e on p.dnum = e.dno 
join Works_On w on p.pnumber = w.pno 
    and w.essn = e.ssn
where e.dno = 5 and w.hours > 10 and p.pname = 'ProductX' group by fname;
如private chat中所述,表的主键分别为:

  • 项目
    pnumber
  • 员工
    SSN
  • 适用于
    pno
    essn
  • 您的查询正在将
    workson
    表与
    project
    表链接,但缺少与
    employee
    表的关系(
    w.essn=e.ssn

    这两个键(
    pno
    essn
    )都是确保正确关联
    员工
    /
    项目
    /
    工作所必需的

    如您所见,我删除了
    左连接
    。如果要返回左表中的所有行,即使右表中有关联行,这些选项也很有用

    举例说明:我想要所有员工的名单,即使他们没有参与ProjectX

    在您的情况下,这是不必要的,因为您只想了解在项目中工作的员工

    另一个常见的例子是,如果您想要没有参与projectX的所有员工的列表

    最后,我看到项目引用直接位于employee表中(字段
    DNO
    )。这意味着一名员工可以同时参与一个且只能参与一个项目

    如果希望员工能够同时参与多个项目,则需要从员工表中删除项目引用,并将其放入关联表中,如下所示(脚本缺少字段的正确数据类型;它们必须与所引用的表完全相同):

    您可以使用如下查询填充此表(当然,我无法为您测试):


    在我看来,您不应该使用允许返回行的
    left join
    ,即使没有行。此外,也许您应该在字段前面加上表名或别名(为了清楚起见)“最后,我们需要查看原始表的内容才能正确诊断问题。很抱歉,它不允许我编辑我的帖子“ProjectX”、“ProjectY”和“ProjectZ”是否正常“所有人都有
    dnum
    5?还有,“拉梅什”、“乔伊斯”、“富兰克林”和“约翰”都有
    DNO
    5,这正常吗?哦,这可能与此有关,我不知道为什么会这样。但是关于时间的问题呢?在我看来,你的查询不知道如何将什么与什么联系起来。我的意思是,相同的
    DNO
    (5)指4名不同的员工,相同的
    Dnum
    (5)指3个不同的项目,相同的
    PNO
    指3个不同的
    小时(20.00、10.00、32.50),对于项目X(即
    Dnum
    5和
    pnumber
    1),pname仅在项目中,我只是在评论中放了一些图片(无法编辑原始帖子),我不太清楚你的意思。
    CREATE TABLE project_employee (
        SSN VARCHAR(10) NOT NULL,
        pnumber SMALLINT(5) NOT NULL,
        PRIMARY KEY (id, pnumber),
        FOREIGN KEY (SSN) REFERENCES Employee (SSN)
            ON DELETE CASCADE
            ON UPDATE RESTRICT,
        FOREIGN KEY (pnumber) REFERENCES Project (SSN)
            ON DELETE CASCADE
            ON UPDATE RESTRICT
    );
    
    INSERT INTO project_employee (
        SSN,
        pnumber
    ) 
    SELECT
        SSN,
        DNO
    FROM Employee