【问题标题】:SELECT SUM - SQL query not workingSELECT SUM - SQL 查询不起作用
【发布时间】:2018-03-11 20:41:01
【问题描述】:

我创建了一个基于 Olympics 的小型数据库,用于运行一些 sql 查询。我正在尝试生成一个表格,显示每个国家/地区的名称以及来自这些国家/地区的运动员获得的金牌、银牌和铜牌总数。这是我的关系模型视图的屏幕截图:

Relational Model View

这是我正在尝试运行的查询:

<h1>Olympics Database</h1>
<h3>Summary Information</h3>

    <h4>Number of Olympic Athletes from United Kingdom</h4>

<?php

    $conn = mysqli_connect('localhost', '#####', '#####') or die ('Could not connect:' . mysqli_error($conn));
    echo 'Successfully Connected. <br/>';

    mysqli_select_db($conn, '#####') or die('Database will not open');
    echo 'Database Connected. <br/> <br/>';

    $query2 = 'SELECT CountryAbbrev, (SELECT COUNT(CountryAbbrev) FROM athlete WHERE MedalID = 401 AND ath.CountryAbbrev = athlete.CountryAbbrev) AS Gold, (SELECT COUNT(CountryAbbrev) FROM athlete WHERE MedalID = 402 AND ath.CountryAbbrev = athlete.CountryAbbrev) AS Silver, (SELECT COUNT(CountryAbbrev) FROM athlete WHERE MedalID = 403 AND ath.CountryAbbrev = athlete.CountryAbbrev) AS Bronze FROM athlete AS ath';
    $result2 = mysqli_query($conn, $query2) or die ('Invalid Query');

    echo'<table><tr><th>Country Name</th><th>Gold</th><th>Silver</th><th>Bronze</th></tr>';
    $row = mysqli_fetch_row($result2);
    echo'<tr><td>' .$row[0].'</td><td>' .$row[1].'</td><td>' .$row[2].'</td><td>' .$row[3].'</td></tr>';
    echo'</table>';

    mysqli_close($conn);
    ?>

我得到的只是无效的查询。根据我的关系模型视图,谁能帮我弄清楚如何在一张桌子上显示每个国家获得的金牌、银牌和铜牌的总数?

更新: 这是输出的屏幕截图:

【问题讨论】:

  • 你需要加入奖牌和运动员 LEFT JOIN Medal ON athlet.MedalID= Medal。奖牌ID
  • 请提供样本数据和预期结果。谢谢
  • 您还需要一个 GROUP BY 子句,以及 SELECT 中的奖牌 tyoe
  • SUM(MedalID) 会将 ID 值相加而不计算在内。
  • 在您的or die 上,您真的很想查看mysqli_error 以了解实际问题是什么,而不是猜测。

标签: php mysql


【解决方案1】:

由于您在表中选择了未定义的字段,您的原始 SQL 查询返回无效查询。即athlete 表没有名为MedalName 的字段。

您可以使用以下 SQL 查询,通过了解每种奖牌类型的 id,我假设它们分别是 Gold、Silver 和 Bronze 的 1、2、3。

SELECT CountryAbbrev,
 (SELECT COUNT(CountryAbbrev) FROM athlete WHERE MedalID = 1 AND ath.CountryAbbrev = athlete.CountryAbbrev) AS Gold, 
(SELECT COUNT(CountryAbbrev) FROM athlete WHERE MedalID = 2 AND ath.CountryAbbrev = athlete.CountryAbbrev) AS Silver, 
(SELECT COUNT(CountryAbbrev) FROM athlete WHERE MedalID = 3 AND ath.CountryAbbrev = athlete.CountryAbbrev) AS Bronze 
FROM athlete AS ath

更新

抱歉,应该是 COUNT 而不是 SUM。查看SUMCOUNT from this link 之间的区别

【讨论】:

  • 感谢您的意见!我开始看到你的方法的意义。我已经稍微修改了它以匹配我的 MedalID。正如您所建议的,它们分别是金、银和铜的 401、402、403。请再次查看我的回答。我已经更新了我的结果截图。它似乎只显示 1 个国家,没有奖牌
  • 您没有对结果集进行有效循环。现在只要在phpMyAdmin之类的工具中试一下代码就可以看到正确的结果,这样SQL问题就解决了,之后搜索知道如何使用PHP和MySQL执行SQL查询并渲染得到结果。
  • 谢谢!我刚刚在 phpmyadmin 中运行了代码,并且可以正常工作。我现在正在研究一种创建循环以返回所有国家/地区的值的方法
【解决方案2】:

试试这个

SELECT c.CountryAbbrev, 
    (select count(a.MedalID) FROM athlete a WHERE c.CountryAbbrev=a.CountryAbbrev and a.MedalName = "Gold" ) as gold,
    (select count(a.MedalID) FROM athlete a WHERE c.CountryAbbrev=a.CountryAbbrev and a.MedalName = "Silver" ) as Silver,
    (select count(a.MedalID) FROM athlete a WHERE c.CountryAbbrev=a.CountryAbbrev and a.MedalName = "Bronze" ) as Bronze
from country as c 

【讨论】:

  • 这似乎不起作用。你不应该选择 FROM 运动员吗?
【解决方案3】:

为了修复“无效查询”,您需要与medal 表进行左连接,将ANDs 更改为ORs,并使用group by 子句。此外,由于您需要奖牌数,因此您需要将SUM 替换为COUNT。所以你可以这样做:

SELECT CountryAbbrev as country, count(athlete.MedalID) 
FROM athlete 
  LEFT JOIN medal on medal.MedalID = athlete.MedalID
WHERE MedalName = "Gold" 
  OR MedalName = "Silver" 
  OR MedalName = "Bronze"
GROUP BY CountryAbbrev;

此查询输出每个国家/地区的奖牌总数(# 金 + # 银 + # 铜):

+---------+------------------------+
| country | count(athlete.MedalID) |
+---------+------------------------+
| AU      |                      4 |
| US      |                      5 |
+---------+------------------------+

如果你想在不同的列中分别打印出金、银、铜的数量,那么你可以使用以下查询:

SELECT CountryAbbrev as country, 
  sum(if(MedalName = "Gold", 1, 0)) as Gold, 
  sum(if(MedalName = "Silver", 1, 0)) as Silver, 
  sum(if(MedalName = "Bronze", 1, 0)) as Bronze 
FROM athlete 
  LEFT JOIN medal on medal.MedalID = athlete.MedalID 
WHERE MedalName = "Gold" 
  OR MedalName = "Silver" 
  OR MedalName = "Bronze" 
GROUP BY CountryAbbrev;

此查询将输出如下内容:

+---------+------+--------+--------+
| country | Gold | Silver | Bronze |
+---------+------+--------+--------+
| AU      |    1 |      2 |      1 |
| US      |    2 |      1 |      2 |
+---------+------+--------+--------+

如果您还想添加总计列,请尝试以下查询:

SELECT CountryAbbrev as country, 
  sum(if(MedalName = "Gold", 1, 0)) as Gold, 
  sum(if(MedalName = "Silver", 1, 0)) as Silver, 
  sum(if(MedalName = "Bronze", 1, 0)) as Bronze, 
  count(MedalName) as Total 
FROM athlete 
  LEFT JOIN medal on medal.MedalID = athlete.MedalID 
WHERE MedalName = "Gold" 
  OR MedalName = "Silver" 
  OR MedalName = "Bronze" 
GROUP BY CountryAbbrev;

此查询将输出:

+---------+------+--------+--------+-------+
| country | Gold | Silver | Bronze | Total |
+---------+------+--------+--------+-------+
| AU      |    1 |      2 |      1 |     4 |
| US      |    2 |      1 |      2 |     5 |
+---------+------+--------+--------+-------+

我已经在我的机器上运行了这些查询,它们按预期工作。

【讨论】:

  • 仍然收到“无效查询”
  • 你能用die(mysqli_error($conn))之类的东西打印出实际的错误字符串吗?
  • 您的代码在 phpmyadmin 中为我工作 100%,但是当我尝试在 php 中运行时似乎不起作用!我收到此错误:解析错误:语法错误,意外的“Gold”(T_STRING)
  • 当你把它放在php中时,使用\'\"转义引号或者使用内置的php函数来做到这一点。
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 2016-10-26
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多