在多对多表中获取相应的和非对应的值

时间:2016-06-08 07:47:43

标签: php mysql sql sql-server

我的sql中有一个表结构,如下所示:

品牌 - > BrandUser< - 用户

BrandUser表包含userId和brandId列。我需要获得所有注册的品牌,并且他们没有注册。

例如,假设我有userId = 2,它在brandUser表中重复两次,我发送userId = 2 ...我需要从Brands表中获取这两个记录以及其他品牌在BRANDUSER表中哪个用户没有值。我写了以下查询:

   $col = "
       u.id,
       u.username,
       u.firstName,
       bu.active,
       bu.userId,
       b.name";

   $sql = " SELECT $col
              FROM brands b
              LEFT JOIN branduser bu on bu.brandId = b.id
              LEFT JOIN users u on bu.userId = u.id
             WHERE bu.userId = $userId";

 $brandListUserRegistered = $this->getBrandModel()->getBrandsForUser($sql);

这是执行查询的getBrandsForUser操作:

public function getBrandsForUser($sql){
    $resultSet = $this->dbAdapter->query($sql,Adapter::QUERY_MODE_EXECUTE);
    return $resultSet->toArray();
}

我现在关注的主要问题是查询本身...通过上面的查询,我只获得用户的品牌记录,实际上在branduser表中有相应的记录,这不是我想要的...... :/

2 个答案:

答案 0 :(得分:1)

您可以使用BrandUser作为基表,然后将其连接到其他表格;

SELECT
$col
FROM BrandUser bu
LEFT JOIN Brand b
    ON bu.brandId = b.id
LEFT JOIN users u
    ON bu.userId = u.id
WHERE bu.userId = $userId

这样,如果Brand表中没有相应的数据,您将只返回NULL值。

道歉,我误解了你的问题,尝试更改WHERE子句,使其包含在连接中;

SELECT DISTINCT
$col
FROM Brand b
LEFT JOIN BrandUser bu
    ON bu.brandId = b.id
    AND bu.userId = $userId
LEFT JOIN users u
    ON bu.userId = u.id

答案 1 :(得分:1)

也许不是答案,而是改进!

left join时,将右侧表的条件放在ON子句中以获得真正的左连接行为! (在WHERE时,您会获得常规的内部联接结果。)

SELECT $col
FROM brands b
LEFT JOIN branduser bu on bu.brandId = b.id
                       AND bu.userId = $userId
LEFT JOIN users u on bu.userId = u.id