【问题标题】:sql - count total rows with fields containing a particular comma separated valuesql - 计算包含特定逗号分隔值的字段的总行数
【发布时间】:2018-06-13 11:53:18
【问题描述】:

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 的表,其中这些是不同行的唯一 ID mbs_id

Q.2)这与第一个问题有关,两者需要一起完成。我单独写它是为了清楚易懂。所以,假设我还有一个名为ads_category 的表,其中包含字段ac_idac_value。这个ac_id 被插入到第一个表advertisementsads_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。请帮忙。

【问题讨论】:

  • @TimG 如何让它自动化?在这里,如果我使用 select Id from Item where instr(concat(',', Features, ','), ',AB,') <> 0 or instr(concat(',', Features, ','), ',PQ,') <> 0 查询,我需要手动输入值,并且值也可以增加、减少或删除

标签: php mysql sql sql-server


【解决方案1】:

好的,我自己找到了解决方案。这是我实现的预期输出

代码:

<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>

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 感谢您的宝贵时间,但没有帮助。相反,我找到了解决方案。我的答案贴在下面。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多