sql - 计算包含特定逗号分隔值的字段的总行数

时间:2018-01-03 19:04:01

标签: php mysql sql sql-server

Q.1)假设我有一个名为advertisements的表,字段ad_memberships包含逗号分隔的1,2,3,4类型值,我想计算每个的总行数那么我怎么能这样做呢?比如说包含值1的表中的总行数是10,2是5,3是15,4是3等,没有手动输入FIND_IN_SET()函数中的数据?我只是想自动计算所有。此处,1,2,3,4来自名为memberships的表,其中这些是不同行mbs_id的唯一ID。

Q.2)这与第一个问题有关,两者都需要一起完成。我是分开写的,所以它清晰易懂。所以,假设我还有一个名为ads_category的第二个表,其中包含字段ac_idac_value。此ac_id已插入字段advertisements的第一个表ads_category中,以便所有广告都与某些不同的类别相关。现在计算第一个问题中的行后,我想要乘以第一个问题中收到的行数ac_value并显示结果如下。

Standard Membership: 10 ads (Value: $5)
Premium Membership: 16 ads (Value: $12)
Elite Membership: 8 ads (Value: $7)
Ultimate Membership: 11 ads (Value: $8)
and so on....

这意味着对于拥有标准会员资格的会员,可以为拥有高级会员资格的会员提供10个广告,其中有16个广告可用,等等。我怎么能做到这一点?例如,数据库结构如下:

表:会员资格

mbs_id | mbs_name
   1   | Standard
   2   | Premium
   3   | Elite
   4   | Ultimate

表:广告

ad_id  | ad_memberships | ad_category
   1   | 1,2            | 1
   2   | 1,2,3          | 1
   3   | 1,3            | 2
   4   | 2,3            | 3

表:ads_category

ac_id | ac_value
   1  | 0.5
   2  | 1
   3  | 1.5
   4  | 2

上述数据库结构的预期结果

Standard : 3 ads (Value: $1.5)
Premium  : 3 ads (Value: $3)
Elite    : 3 ads (Value: $4.5)
Ultimate : 0 ads (Value: $0)

现在我想加入所有三个表并获得相关结果。是的,在查询中不能手动输入任何值。所有这些都应该使用数据库中的值来完成。我怎样才能做到这一点?我正在使用PDO。请帮忙。

2 个答案:

答案 0 :(得分:0)

我无法确定您的公式应该如何运作,因为您在问题中显示的示例结果似乎与示例数据不匹配。但也许这会让你知道如何开始。

SELECT CONCAT(
    m.mbs_name,
    '  Membership: ',
    COUNT(a.ad_id),
    ' ads ($',
    SUM(c.ac_value)
    ')'
  ) AS result
FROM memberships AS m
LEFT OUTER JOIN advertisements AS a ON FIND_IN_SET(m.mbs_id, a.ad_memberships)
LEFT OUTER JOIN ads_category AS c ON a.ad_category = c.ac_id
GROUP BY m.mbs_id

答案 1 :(得分:0)

好的,所以我自己找到了解决方案。这是我达到的预期产量

enter image description here

CODE:

<div class="row">
  <?php
    $mbs = $pdo->prepare("SELECT mbs_id, mbs_name, mbs_color, mbs_perclick FROM memberships");
    $mbs-> execute();

    while($mbsid = $mbs->fetch()){ extract($mbsid);
    $adstotal = $pdo->prepare("SELECT COUNT(*) as cnt, SUM(ac_value) FROM advertisements
    LEFT JOIN ads_category ON ads_category.ac_id = advertisements.ad_category
    WHERE INSTR(CONCAT(',', ad_memberships, ','), ',".$mbs_id.",') <> 0");
    $adstotal-> execute();
    $adsf = $adstotal->fetch();
  ?>
    <div class="col-sm-2">
      <span class="membership-indicator" style="background: <?php echo $mbs_color; ?>; margin-top: 5px"></span>
      <?php echo $mbs_name; ?>
    </div>
    <div class="col-sm-2 text-center">
      <?php echo $adsf['cnt']; ?>
    </div>
    <div class="col-sm-2 text-center">
       $<?php $cps = $mbs_perclick/100; $finalval = $adsf['SUM(ac_value)']*$cps; echo number_format($finalval,4,'.',','); ?>
    </div>
    <?php } ?>
</div>