我的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表中有相应的记录,这不是我想要的...... :/
答案 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