如何在 html 表中填充 UNION ALL 查询数据[关闭]
Posted
技术标签:
【中文标题】如何在 html 表中填充 UNION ALL 查询数据[关闭]【英文标题】:How to populate UNION ALL query data in html table [closed] 【发布时间】:2020-03-01 09:25:53 【问题描述】:如何使用 php 和 mysql 获取的两侧标题填充 html 表中的数据。我没有得到输出显示,正如我想要的那样,就像在所需的输出图像中一样。
$query = $db->prepare("SELECT player, score FROM cricket_table WHERE dateby BETWEEN '2020-01-01' AND '2020-03-01'
UNION ALL
SELECT player, score FROM football_table WHERE dateby BETWEEN '2020-01-01' AND '2020-03-01'");
$query->execute;
echo '<table><tr><th>Player Name</th><th>Cricket</th><th>Football</th></tr>';
while($row = $query->fetch(PDO:: FETCH_ASSOC) )
echo '<tr>
<td>'.$row['player'].'</td>
<td>'.$row['score'].'</td>
</tr>';
echo '</table>';
这是所需的output
这是当前的输出
【问题讨论】:
除了您提供的代码无效之外,您还有什么问题? 我没有得到输出显示,正如我想要得到的那样,就像上面所需的输出图像一样。 如果不同表中有相同的列,为什么不只使用一个表和标志呢?例如,在 WordPress 中,它们有 wp_posts 表和 post_type,其中存储了帖子的类型(例如:产品、附件、帖子等)您可以在您的标志中执行相同的操作(例如:sport_type)您可以存储类似的值板球、足球等,然后您可以使用 LEFT JOIN UNION ALL 不是您要查找的内容,因为返回结果就像您只查询一张表一样。您必须使用带有外键的 JOIN,它可以是 player_id: SELECT a.*, c.*, f.* FROM player AS a LEFT JOIN cricket_table AS c ON a.player_id = c.player_id LEFT JOIN football_table AS f ON a .player_id = f.player_id 请提供真实样本数据,或制作sqlfiddle.com 【参考方案1】:您可以使用 UNION ALL 并将每列所需的值相加:
这是您的 SQL。请注意,它将使用 union all 运行两个查询,然后对每个值求和。我们将使用“0”(零)技巧来忽略“错误”表:
SELECT x.player, SUM(x.cricket_score) as cricket_score, SUM(x.football_score) as football_score FROM (
SELECT player, SUM(score) as cricket_score, 0 as football_score
FROM cricket_table
WHERE dateby BETWEEN '2020-01-01' AND '2020-03-01'
GROUP BY player
UNION ALL
SELECT player, 0 as cricket_score, SUM(score) as football_score
FROM football_table
WHERE dateby BETWEEN '2020-01-01' AND '2020-03-01'
GROUP BY player
) x
GROUP BY x.player
并应用于代码:
$query = $db->prepare(" SELECT x.player, SUM(x.cricket_score) as cricket_score, SUM(x.football_score) as football_score FROM (
SELECT player, SUM(score) as cricket_score, 0 as football_score
FROM cricket_table
WHERE dateby BETWEEN '2020-01-01' AND '2020-03-01'
GROUP BY player
UNION ALL
SELECT player, 0 as cricket_score, SUM(score) as football_score
FROM football_table
WHERE dateby BETWEEN '2020-01-01' AND '2020-03-01'
GROUP BY player
) x
GROUP BY x.player");
$query->execute();
echo '<table><tr><th>Player Name</th><th>Cricket</th><th>Football</th></tr>';
while($row = $query->fetch(PDO:: FETCH_ASSOC) )
echo '<tr>
<td>'.$row['player'].'</td>
<td>'.$row['cricket_score'].'</td>
<td>'.$row['football_score'].'</td>
</tr>';
echo '</table>';
使用此 SQL,您将获得板球或足球已经设置的值。
【讨论】:
它返回板球和足球的板球数据。就像板球得分是 44 一样,足球也显示 44。 每一列的数据来源不同。您确定您使用的是准确的代码,和/或表格有不同的数据吗?我不明白它怎么会像你描述的那样发生。 是的,我使用的是确切的方法,所有表的数据都不同。 它的工作方式完全符合预期:phpfiddle.org/lite/code/dngv-qjgc .. 你确定你使用的是相同的代码吗?如果您有更多表,则需要为列指定不同的名称并在所有列中使用 0(零)技巧。 这取决于您的数据的存储方式。您可以尝试添加时间部分以确保它会获得盘中时间,例如“2020-05-03 00:00:00”和“2020-05-03 23:59:59”【参考方案2】:SELECT c.player, c.score AS cr_score, f.score AS fb_score FROM cricket_table c
INNER JOIN football_table f ON f.player=c.player AND (f.dateby BETWEEN '2020-01-01' AND '2020-03-01')
WHERE c.dateby BETWEEN '2020-01-01' AND '2020-03-01'
现在尝试输出表格,
while($row = $query->fetch(PDO:: FETCH_ASSOC) )
echo '<tr>
<td>'.$row['player'].'</td>
<td>'.$row['cr_score'].'</td>
<td>'.$row['fb_score'].'</td>
</tr>';
无法对其进行测试,但您大致了解,应该可以工作
【讨论】:
如果球员不一定有每项运动的得分,你可以使用大小写和空值,但这是最简单的版本^ 我试过这个方法。它返回错误的结果,并通过提交较大的日期范围(如 2 年)。 mysql 服务器停止工作。并通过结束 mysql 进程给出此错误警告:未捕获的 PDOException:PDO::__construct():MySQL 服务器已消失 与联合所有它返回正确的结果,但没有正确地将其填充到 html 表中。以上是关于如何在 html 表中填充 UNION ALL 查询数据[关闭]的主要内容,如果未能解决你的问题,请参考以下文章