【问题标题】:How to populate UNION ALL query data in html table [closed]如何在 html 表中填充 UNION ALL 查询数据[关闭]
【发布时间】: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

标签: php mysql union-all


【解决方案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 表中。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多