如何多个内连接同一个表,但哪个不同的外键,如果它甚至可能?

时间:2012-12-11 13:19:23

标签: php mysql reference foreign-keys

我有一个带有gebruikersid的双重外键引用的表,现在我有点乱。首先,“gebruiker”是荷兰人的“用户”,以避免误传。

我现在使用的查询是:

$uploadeditems = "
                SELECT *
                FROM file f
                    INNER JOIN gebruikers g on f.empid = g.gebruikersid
                WHERE g.gebruikersid = ".$GET['employeeid']."
                ";

但实际上我需要做的是这样的事情:

        $uploadeditems = "
                        SELECT *
                        FROM file f
                            INNER JOIN gebruikers on f.empid = gebruikers.gebruikersid as 'gebruikers.employee'
                            INNER JOIN gebruikers on f.gebruikersid = gebruikers.gebruikersid as 'gebruikers.uploader'
                        WHERE gebruikers.employee= ".$GET['employeeid']."
                        ";



简短的代码,所以你明白我的观点:

表格文件有gebruikersid,谁是文件的上传者,empid是该文件必须链接的文件。 (gebruiker.gebruikersid的FK)。

因此,例如我在我的数据库中:

fileid  filename    filesize    filepath           custid   empid   gebruikersid    filedescription

228     Test.         60    files/employees/113/    NULL     113    70  

所以我基本上尝试的是有两个参考:

当我在f.empid内部加入时,我希望能够返回username引用的f.empid & gebruiker.gebruikersid,同时我希望能够返回username引用的f.gebruikersid & gebruikers.gebruikersid,所以我可以返回的内容就像:

user X的文件列表:
File A上传的user Y File B上传的user Z 等等...

现在我明白了:
user X的文件列表:
File A上传的user X File B上传的user X 即使它在数据库中都很好。

编辑由于我之前有一个员工表(现在所有员工都是用户),我的代码名称搞砸了,可能有点难过。一旦我继续前进,就需要弄清楚这一点。

2 个答案:

答案 0 :(得分:3)

如果多次加入同一个表,则需要为至少一个实例使用别名。然后,您必须使用别名为从表中选择的所有字段添加前缀。

例如:

SELECT f.*, employee.FIELD1 as e_FIELD1, uploader.FIELD1 as u_FIELD1 ...

FROM   file f

       INNER JOIN gebruikers as employee
       on f.empid = employee.gebruikersid

       INNER JOIN gebruikers as uploader
       on f.gebruikersid = uploader.gebruikersid

WHERE gebruikers.employee= ".$GET['employeeid']."

答案 1 :(得分:1)

我同意上面的答案,但你应该在每个联接中用g1和g2替换gebruikers。 对我来说,最好用外连接替换内连接,因为如果你的表中的empid可能为null,那么这段脚本将不返回任何内容。