php - 显示来自 MySQL 数据库的唯一值

标签 php mysql sql mysqli

我报告我的问题是为了更简洁一点。 (删除其他)

我有一个自己建立的时间报告系统,我正在尝试创建一个依从性类型的报告。

基本上我正在尝试执行以下操作:

  1. 根据 where 子句和字段 practice=ccv & year=2016(例如)在我的数据库中收集所有唯一名称($fn、$ln)
  2. 然后我还想根据 practice=ccv & year=2016 和附加的 where 子句 week=8 收集另一个名称列表 ($fn, $ln)
  3. 这将给我 2 个不同的列表,我可以比较它们,不同之处将是第 8 周的未完成考勤卡。

从那里,我需要显示所有提交的名称(来自上面的#3)以及未完成的列表(通过比较上面的#1 和#2)

到目前为止,我可以获得名称列表。但是,然后我需要为每个人显示来自数据库的附加数据(地区、时间戳等..)

期望的输出是这样的:
已提交
欧洲、中东和非洲
约翰·杰
沃利R
北美
戴维斯 D
鲍勃·C
约翰 Y

优秀
欧洲、中东和非洲
凯尔·D
北美
科里·T
休·R
约翰·杰
拉丁美洲
等等....

到目前为止,这就是我所拥有的..我确定我的做法是错误的。

<?php
$con = mysqli_connect("localhost","xxx","xxx!","xxx");                  

//Get distinct names from practice
if ($con) {
$SQL = "SELECT DISTINCT fn,ln FROM $table WHERE year='$year' AND practice='$practice' AND archived!='yes' ORDER BY region,fn,ln";   
}

$result = mysqli_query($con,$SQL);

if (!$result) die('Couldn\'t fetch records'); 

while ( $db_field = mysqli_fetch_assoc($result) ) {
$name[] = trim($db_field['fn']. " " .$db_field['ln']);
}


//Get distinct names for current week practice
if ($con) {
$SQL2 = "SELECT DISTINCT fn,ln FROM $table WHERE year='$year' AND week_num='$week' AND practice='$practice' AND archived!='yes' ORDER BY region,fn,ln"; 
}

$result2 = mysqli_query($con,$SQL2);

if (!$result2) die('Couldn\'t fetch records Again'); 

while ( $db_field = mysqli_fetch_assoc($result2) ) {

$name2[] = trim($db_field['fn']. " " .$db_field['ln']);
}

//$SQL3 = "SELECT fn,ln,week_start_date,region FROM $table WHERE fn IN ( '".implode("', '", $differences)."' )");

mysqli_close($con);
?>

<TABLE><TR><TD>
<B>All Names</B><BR>
<?php
foreach ( $name as $item ) {
    echo $item . "<br/>";
}
?>
</TD>
<TD>
<B>Names for Week 8</B><BR>
<?php
foreach ( $name2 as $item2 ) {
    echo $item2 . "<br/>";
}
?>
</TD>
<TD>
<B>Outstanding</B><BR>
<?php
$results = array_diff($name, $name2);

foreach($results as $val) {
    echo $val ." - ".$val2."<BR>";          
}
?>

</TD>
</TR>
</TABLE>

最佳答案

我认为你应该在 MySQL 级别解决这个问题。

// All names with all data
$SQL = "SELECT DISTINCT *, CONCAT(fn,' ',ln) AS `name` FROM $table WHERE year='$year' AND practice='$practice' AND archived!='yes' ORDER BY region,fn,ln";

// Names for specific week with all data
$SQL = "SELECT DISTINCT *, CONCAT(fn,' ',ln) AS `name` FROM $table WHERE year='$year' AND week_num='$week' AND practice='$practice' AND archived!='yes' ORDER BY region,fn,ln";

// Outstanding rows with all data
$SQL = "SELECT * FROM (SELECT DISTINCT *, CONCAT(fn,' ',ln) AS `name` FROM $table WHERE year='$year' AND practice='$practice' AND archived!='yes') AS `subquery` WHERE `name` NOT IN (SELECT DISTINCT CONCAT(fn,' ',ln) AS `name` FROM $table WHERE year='$year' AND week_num='$week' AND practice='$practice' AND archived!='yes') ORDER BY region,fn,ln";

这样您就不需要在 PHP 级别对数据进行排序和处理。无法对此进行测试,因为我没有数据库环境,但它应该可以工作,可能需要一些小的更改。

关于php - 显示来自 MySQL 数据库的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35557079/

相关文章:

php - 抽象路径或 __FILE__?

php - 提交PHP mysql后如何编辑数据库信息并保留表单中的值

php - 将来自其他表的 select id 与 insert on single 命令结合起来

php - sql和mysql联合查询

mysql - SQL查询导致重复

php - 在mysql中搜索查询

mysql - 在 MySQL 上模拟滞后函数

c# - 如何优化这个 linq 查询?

sql - PostgreSQL - 忽略 LIKE 表达式中的字符序列

mysql - 在MYSQL中设置日期参数