SQL选择带有where子句的子表中的项目计数

时间:2019-11-20 16:00:55

标签: sql subquery outer-join

SQL查询:

select c.cid, la.lid, b.bid, b.type 
from c c 
  left join la la on c.cid = la.cid
  left join b b on la.lid = b.lid
where b.type = 'Primary';

有三个表c-> la-> b

对于任何给定的“ la”,我都需要总数为“ b”,但是出于其他目的,我需要在where子句中使用“ b.type ='Primary'”。

b.type有两种类型-Primary和Secondary,但是我要计算'b'的总数(Primary和Secondary),有人可以给出任何提示吗?对我来说这将是一个很好的学习。谢谢。

sample data and desired o/p

4 个答案:

答案 0 :(得分:1)

尝试一下:

SELECT 
  c.cid, 
  la.lid, 
  b.bid, 
  b.type,
  d.cbdi
FROM c c 
LEFT JOIN la la ON c.cid = la.lid
LEFT JOIN b b ON la.lid2 = b.lid2
LEFT JOIN (
            SELECT 
              la.lid,
              COUNT(b.bid) AS cbid
            FROM la la 
            LEFT JOIN b b ON la.lid2 = b.lid2
            GROUP BY la.lid
          ) d ON la.lid = d.lid
WHERE
  b.type = 'Primary';

答案 1 :(得分:1)

由于有secondary子句,因此无法根据所附的屏幕快照在期望的输出中包含where b.type = 'Primary'的行。请再次检查,看来您的要求不清楚。

答案 2 :(得分:1)

您似乎想显示所有未聚合的行,但同时显示一个聚合(b计数)。这是通过窗口函数COUNT OVER完成的。

select c.cid, la.lid, b.bid, b.type, count(*) over (partition by la.lid) as number_of_b
from la
join c on c.cid = la.cid
join b on b.lid = la.lid
order by c.cid, la.lid, b.bid;

如果要将其限制为至少有一个主la的{​​{1}},请相应地扩展此查询:

b

答案 3 :(得分:0)

一种解决方案是对表b进行两次连接,以仅选择主记录,然后对所有记录进行计数。像这样:

$query = mysqli_query($conn, "SELECT * FROM `store_products`");
$res = [];

if(mysqli_num_rows($query) >= 1) {
    $mmbr = getMember("Admin");
    $sql  = 'SELECT `product_name`,`price`,`quantity`,`product_permissions` FROM `store_products` WHERE';

    while($row = mysqli_fetch_assoc($query)) {
        // bool / int
        $getGroup = InGroupID($mmbr["main_group_id"], $mmbr["secondary_group_ids"], $row["product_permissions"]);

        // Concat all the existing group into a query string.
        if($getGroup) { 
            $sql .=  " CONCAT(',', product_permissions, ',') like '%{$getGroup}%' OR";
        }
    }

    // Remove last OR
    $sql       = rtrim($sql, 'OR');

    $prepare   = mysqli_query($conn, $sql);
    // If finally using PDO, you can do this instead
    // $res = $sth->fetch(PDO::FETCH_ASSOC);
    // Saves you from another loop.
    while($row = mysqli_fetch_assoc($prepare)) {
        $res[] = $row;
    }

    // Tested and Working, Thanks!!
    echo json_encode($res);
}
else {
    $res = [
        "product_name" => "no_products_available_foruser",
        "price"        => 0,
        "quantity"     => 0    
    ];

    echo json_encode($res);
}


  [1]: https://www.php.net/manual/en/book.pdo.php
相关问题