如何在 html 表中填充 UNION ALL 查询数据[关闭]

Posted

技术标签:

【中文标题】如何在 html 表中填充 UNION ALL 查询数据[关闭]【英文标题】:How to populate UNION ALL query data in html table [closed] 【发布时间】:2020-03-01 09:25:53 【问题描述】:

如何使用 phpmysql 获取的两侧标题填充 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 查询数据[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据传递的参数选择 Union ALL(需要优化)?

union all 效率问题

如何在没有 UNION ALL 的情况下查询 redshift 中的许多表?

union和union all用法

union all 和 union

oracle中union和union all 使用区别