【问题标题】:PHP MYSQL data count retrieve from mysql gone wrong从mysql检索PHP MYSQL数据计数出错
【发布时间】:2014-12-12 15:37:35
【问题描述】:

我是 php 和 MySQL 的新手。我有一个用这个 SQL 构建的表

CREATE TABLE classs
(sid INT(11) NOT NULL,
cid INT(11) NOT NULL,
lid INT(11) NOT NULL,
 date DATE NOT NULL,
UNIQUE (sid, cid,lid,date));

我的数据库输入是

sid || cid|| lid date (ALL DATE IS DIFFERENT with in case of same ID)
==================================
2001      ||  1001   || 8
2001      ||  1001   || 8
2002      ||  1001   || 8
2003      ||  1001   || 8 
2003      ||  1001   || 8
==================================

在这里,我需要使用php构建一个代码来显示这样的结果

2001          2
2002          1
2003          2

我在 view.php 上使用此代码

<?php
require_once('core/init.php');

$con=mysqli_connect("localhost","root","root","studentattendancesystem");

if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql="select *,count(sid) from classs group by sid";
$result = $con->query($sql);

if ($result->num_rows > 0)
{
  while($row = $result->fetch_assoc()) 
  {
    $rowcount=mysqli_num_rows($result);
    $sid = $row["sid"];
    echo $sid, " ", $rowcount," ","<br>";    
  } 
}
else
{
  echo 'Failed';
} 

但我的输出是

2001         3 //should be 2
2002         3 //should be 1
2003         3 //should be 2

我错过了什么?

【问题讨论】:

  • GROUP BY 什么?你在那里遗漏了一些东西。在学习 MySQL 时,您应该始终在浏览器选项卡中打开 the documentation,任何时候您对语句的工作原理感到好奇,请查看相关文档。
  • 按学生证分组,先生。所以,如果学生 id 出现两次,它将计为 2。但我的代码给了我错误的答案:'(
  • @xNour 这不是它在您的代码中所说的。也不需要形式,尤其是不需要那种尴尬的性别差异。
  • “但我的输出是(代码)” - 那么,预期的输出是什么?
  • 欢迎来到 StackOverflow。我们曾经都是初学者。唯一愚蠢的问题是未提出的问题。这里的目的是帮助您,并建立一个庞大的问题和答案数据库。因此,你的祈求是不必要的。我会把它们编辑掉。

标签: php mysql select count


【解决方案1】:

我认为我们都缺少的一件事是他正在设置$rowcount =mysqli_num_rows($result)

所以他当然得到了三个,$row 计数需要设置为:$rowcount = $row['count'],如 Ollie 的示例所示。

【讨论】:

  • 你能说得更具体些吗?我不明白
  • $sql="select *,count(sid) count from classes group by sid"; $result = $con->查询($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { //$rowcount=mysqli_num_rows($result); $rowcount = $row['sid']; $sid = $row["sid"]; echo $sid, " ", $rowcount," ","
    "; } } // 这段代码给了我奇怪的输出。 :'(
  • 在您的查询中,像 Ollie 的 (count(*) count 一样设置它(这会将其设置为 count 的别名),然后在您的 php 代码中输入 $rowcount = $row['count'];
  • 很高兴为您提供帮助,我知道当我遇到困难时我经常使用这个网站。
【解决方案2】:

您的查询不正确

select *,count(sid) from classs group by sid

应该是

SELECT studentID,COUNT(*) FROM classs GROUP BY studentID

Fiddle

【讨论】:

  • 给我正确的输出(就像你说你想要的那样),看小提琴。
  • 正确的输出应该是 2001 2 || 2002 1 || 2003 2
  • 那么你没有看到小提琴中的输出吗?
  • 我在你的小提琴中注意到你没有使用独特的命令,为什么会这样,xNour 做错了什么?
  • 在同一字段上对结果进行分组时,不需要 UNIQUE。
【解决方案3】:

专业提示:不要在程序的查询中使用SELECT *,除非您知道确切为什么要这样做。这很可能是浪费和不正确的,尤其是在包含GROUP BY 的查询中。此外,避免 SELECT * 将使您在查询中获得正确的列名。

您正在尝试按学生 ID 汇总原始数据..

此查询将为您执行此操作。

SELECT studentID, COUNT(*) count
  FROM class
 GROUP BY studentID

我已将其放入 sqlfiddle。 http://sqlfiddle.com/#!2/5c6d1/1/0

认为您的表格比您向我们展示的要复杂。在这种情况下,您可能会误解示例数据。

无论如何,大多数开发人员使用简单的 SQL 客户端(如 phpMyAdmin 或 HeidiSQL 或其他)来解决此类查询。然后他们将它们嵌入到他们的 php 中。

【讨论】:

  • 这行得通。但是,我有一个关于COUNT(*) count 的问题,为什么COUNT(*) 后面会出现“计数”这个词? 好奇。
  • 仍然错 :'( 我已经做了你们所有人教我的事情。但我仍然错了。我在我的 mysql 上执行此操作“按 sid 从类组中选择 sid,count(sid)”和我得到了我的答案。但是当我在 php 中这样做时,一切都错了,而且很奇怪。请帮帮我:'(
  • @xNour 如果它在您的 SQL 客户端中工作,则将其复制并粘贴到您的 PHP 代码中并检查控制台中的输出。
  • 我做到了。但它仍然给我错误的答案。我尝试制作新表并尝试根据相同的概念检索数据。但是,即使有 3 个相同的 id,它也会被计为 1,并且所有其他不同的 id 都算作 1。
  • @Fred-ii-COUNT(*) count 导致结果集列名称为count 而不是COUNT(*)。它只是一个列别名。没什么大不了的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
相关资源
最近更新 更多