如何在mysql表中添加最后一列

时间:2016-01-13 07:32:50

标签: php mysql sql

这是我的脚本代码

$sql ="SELECT     t.Contact_Email,
                  e1.Contact_Email email1,
                  e2.Contact_Email email2,
                  e3.Contact_Email email3,
                  e4.Contact_Email email4
         FROM     (
                  SELECT e.Contact_Email FROM email1 e
                  UNION ALL 
                  SELECT e.Contact_Email FROM email2 e
                  UNION ALL 
                  SELECT e.Contact_Email FROM email3 e
                  UNION ALL 
                  SELECT e.Contact_Email FROM email4 e
                  ) t
        LEFT JOIN email1 e1
              ON  t.Contact_Email = e1.Contact_Email
        LEFT JOIN email2 e2
              ON  t.Contact_Email = e2.Contact_Email
        LEFT JOIN email3 e3
              ON  t.Contact_Email = e3.Contact_Email
        LEFT JOIN email4 e4
              ON  t.Contact_Email = e4.Contact_Email";

echo '<table><thead><tr><th>Email</th>';
for ($i=1;$i<5; $i++){
    echo "<th>email $i</th>";
}
echo '</tr></thead><tbody>';

$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
    echo '<tr><td>'.$row['Contact_Email'].'</td>';
    for ($i=1;$i<5; $i++){
        echo '<td>'.(empty($row['email'.$i])?'no':'yes').'</td>';
    }
    echo '</tr>';
}
echo '</tbody></table>';

输出是:

Current output

表格的奇数列表示“开放”操作,偶数列表示“点击”操作。 现在我想在最右边添加一个“总计”列。

所以在图片中,标题是电子邮件1,电子邮件3,电子邮件5 ... ,这些列代表“开放”操作以及它所说的位置 电子邮件2,电子邮件4,电子邮件6 ... 表示点击操作。

现在,总数应按如下方式计算:

开放式操作值2分,点击次数值5分。因此,如果开放操作有2个“是”值,则3个“是”值 点击动作,然后总数应为 2x2 + 3x5 = 19

这是我想要的输出。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可以在SQL中执行此操作。在这样做的同时,我也注意到您不需要params,只能使用JOINS部分来完成,如下所示:

UNION

上面的查询将返回与您已有的相同的内容,但附加的列具有总计。你完全可以控制配方, 你甚至可以决定一种点击比另一种更有价值。

请注意,最重要的更改是在内部SELECT Contact_Email, MAX(CASE source WHEN 1 THEN Contact_Email END) as email1, MAX(CASE source WHEN 2 THEN Contact_Email END) as email2, MAX(CASE source WHEN 3 THEN Contact_Email END) as email3, MAX(CASE source WHEN 4 THEN Contact_Email END) as email4, SUM(points) as Total FROM ( SELECT e.Contact_Email, 1 as source, 2 as points FROM email1 e UNION ALL SELECT e.Contact_Email, 2 as source, 5 as points FROM email2 e UNION ALL SELECT e.Contact_Email, 3 as source, 2 as points FROM email3 e UNION ALL SELECT e.Contact_Email, 4 as source, 5 as points FROM email4 e ) t GROUP BY Contact_Email 语句中添加 points 值。

我确实假设表 email1 (和 email2 ,...)中的记录没有重复的 Contact_Email 值。但是,如果是这种情况,那么要么保留它也要计算总计中的重复项,要么在内部SELECT语句中执行SELECT DISTINCT

这是一个简单的fiddle

答案 1 :(得分:0)

根据您发布的代码,以下是我处理此问题的方法。

首先,我创建一个关联查找数组,其键是列名,其值是对应的点值;它看起来像这样:

$pointVals = array('email1' => 2, 'email2' => 5, 'email3' => 2, ... );

您可以根据需要生成此阵列;我可能从数据库中的查找表中读取它。请注意,此数组仅包含与计算相关的列。

接下来,我将在<{1}}循环中包含以下代码 while是您致电$row时返回的记录数组。

mysql_fetch_array()

话虽如此,我强烈建议您将 mysql 驱动程序转换为 mysqli PDO ,因为 mysql < / strong>已弃用并已从PHP 7中删除。此外,我强烈怀疑您的查询可以简化和改进,但我需要查看基表以提出任何建议。