这是我的脚本代码
$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>';
输出是:
表格的奇数列表示“开放”操作,偶数列表示“点击”操作。 现在我想在最右边添加一个“总计”列。
所以在图片中,标题是电子邮件1,电子邮件3,电子邮件5 ... ,这些列代表“开放”操作以及它所说的位置 电子邮件2,电子邮件4,电子邮件6 ... 表示点击操作。
现在,总数应按如下方式计算:
开放式操作值2分,点击次数值5分。因此,如果开放操作有2个“是”值,则3个“是”值 点击动作,然后总数应为 2x2 + 3x5 = 19 。
这是我想要的输出。我怎么能这样做?
答案 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中删除。此外,我强烈怀疑您的查询可以简化和改进,但我需要查看基表以提出任何建议。