【问题标题】:Getting corresponding and non corresponding values in many to many table在多对多表中获取对应和不对应的值
【发布时间】:2016-10-08 08:35:37
【问题描述】:

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

品牌 -> 品牌用户

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

【问题讨论】:

  • 左连接时,将右侧表的条件放在ON子句中,以获得真正的左连接行为! (在 WHERE 中,您会得到常规的内部连接结果。)
  • 你能以答案的形式回复,以便我明白你的意思吗?

标签: php mysql sql sql-server


【解决方案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

【讨论】:

  • 抱歉,我看错了你的问题。我已经更新了答案,试一试。
  • Rich Benner,我认为它确实有效,一秒钟就可以检查结果.. :)
  • 我也得到了重复的结果......但它返回的结果像 700 个大声笑......我应该按 bu.brandId 或类似的方式进行分组吗??
  • 我不确定您在选择中使用了哪些列,但如果您只想删除重复项,那么您可以执行 SELECT DISTINCT。我已经在我的回答中添加了这一点。
  • 嗨 Rich,这些是列:SELECT u.id,u.username,u.firstName,bu.active,bu.userId,b.name FROM Brands b LEFT JOIN BrandUser bu ON bu。 brandId = b.id AND bu.userId = 487 LEFT JOIN users u ON bu.userId = u.id
【解决方案2】:

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

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

【讨论】:

  • 嘿 Jarlih,我试过了,但我在查询结果中得到了重复的结果...也许我应该按 bu.brandId 或类似的方式进行分组??
  • 我说的和 Rich Brenner 一样,试试SELECT DISTINCT
  • 它有效它有效它有效!!!!非常感谢你们!!你不知道这对我有多大帮助!!我的天啊!! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2019-07-22
  • 2017-12-12
  • 2017-07-14
相关资源
最近更新 更多