MySQL使用空重复行左连接4个表

MySQL使用空重复行左连接4个表,mysql,left-join,Mysql,Left Join,我被一个查询困住了,我将从结果开始,以防这是显而易见的,然后提供更多细节 用户跟踪的赞助商跟踪的是供应商,我试图显示所有带有用户ID的产品,对于存在用户ID的赞助商产品,如果没有用户ID,则为NULL Desired result (userid = 1): productid | supplierid | userid 1 1 1 2 1 1 3 2

我被一个查询困住了,我将从结果开始,以防这是显而易见的,然后提供更多细节

用户跟踪的赞助商跟踪的是供应商,我试图显示所有带有用户ID的产品,对于存在用户ID的赞助商产品,如果没有用户ID,则为NULL

Desired result (userid = 1):
productid |  supplierid  |  userid
    1            1            1
    2            1            1
    3            2           Null
    4            3            1
    5            2           Null
    6            3            1

Actual result (userid = 1):
productid |  supplierid  |  userid
    1            1            1
    1            1           Null
    2            1            1
    2            1           Null
    3            2           Null
    4            3            1
    4            3           Null
    5            2           Null
    6            3            1
    6            3           Null
我的问题是:

SELECT product.productid, product.supplierid, usersponsor.userid FROM product 
INNER JOIN supplier ON product.supplierid = supplier.supplierid
LEFT JOIN sponsorsupplier ON sponsorsupplier.supplierid = product.supplierid
LEFT JOIN usersponsor ON usersponsor.sponsorid = sponsorsupplier.sponsorid and usersponsor.userid = 1
我有四张桌子

sponser
supplier
product
myuser
使用以下两个链接表:

usersponsor
sponsorsupplier
示例表:

myuser:userid
  1
  2
  3
  4
  5

Sponsor:sponsorid
  1
  2
  3

Supplier:supplierid
  1
  2
  3

usersponsor
userid     |   sponsorid
  1        |       1     <- user 1 follows sponsor 1
  2        |       2
  2        |       3

sponsorsupplier
sponsorid  |   supplierid
  1        |       1     <- supplys product 1,2 (sponsor 1)
  1        |       3     <- supplys product 4,6 (sponsor 1)
  2        |       2 
  2        |       1
  3        |       3     


Product
productid  |  supplierid
  1        |      1       <-
  2        |      1       <-
  3        |      2
  4        |      3       <-
  5        |      2
  6        |      3       <-
myuser:userid
1.
2.
3.
4.
5.
赞助商:赞助商
1.
2.
3.
供应商:供应商ID
1.
2.
3.
用户发起人
用户ID |赞助商ID

1 | 1您可以聚合子查询:

SELECT
    p.productid
  , p.supplierid
  , ss.userid
FROM Product p
LEFT JOIN (
        SELECT
            ss.supplierid
          , MIN( us.userid ) userid
        FROM sponsorsupplier ss
        INNER JOIN usersponsor us ON ss.sponsorid = us.sponsorid
        WHERE us.userid = 1
        GROUP BY
            ss.supplierid
    ) ss ON p.supplierid = ss.supplierid
ORDER BY
    p.productid;

谢谢,这是一个非常优雅的解决方案。我不知道你可以把所有的东西都放到子查询中,然后外部连接到子查询中。不仅仅是减少要连接的行数。有时,在一个或多个子查询中使用聚合是获取正确数字的唯一方法。由于连接的乘数效应,对多个连接进行聚合可能会对结果产生不利影响。