2016-02-22 39 views
1

我報告我的問題是要更簡潔一點。 (刪除其他)顯示來自MySQL數據庫的唯一值

我有一個我建立的時間報告系統,並且我正在嘗試創建一個遵從性類型報告。

Esentially我試圖做到以下幾點:

  1. 收集所有唯一的名稱($ FN,LN $)在我的數據庫的基礎上,where子句和領域實行= CCV &年= 2016 (例如)
  2. 然後我也想收拾名($ FN,$ LN),在實踐基礎上的另一份名單= CCV &年= 2016和額外的where子句周= 8
  3. 這會給我2 DISTINCT列出我可以比較的內容,其差異將爲第8周的傑出時間卡。

從那裏,我需要(通過對比#1以上#2)

至此,以顯示提交(從上面的#3),也是優秀之列所有的名字,我可以得到名單。不過,我當時需要從數據庫中每個人額外的數據顯示它們(區,時間戳等)

所需的輸出會是這樣的:
提交
EMEA
約翰Ĵ
沃利ř
北美
戴維斯d
鮑勃ç
約翰Ÿ

優秀
EMEA
凱爾d
北美
科裏牛逼
休 - [R
約翰Ĵ
LATAM
等....

到目前爲止,這裏是我所擁有的......我確信我正在以這種錯誤的方式去做。

<?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> 

回答

1

我認爲你應該在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級別對數據進行排序和處理。由於我沒有數據庫環境,所以無法測試,但它應該可以工作,可能需要一些小的更改。

+0

這就是我正在尋找的......我知道sql級別是一個更好的工作點。我會做一些測試並報告回來!非常感謝。 – Vacek

+0

掙扎與第三個查詢。前兩個工作正常,如果我刪除「,*」.... \t $ SQL3 =「SELECT DISTINCT CONCAT(fn,'',ln)AS'name',* FROM $ table WHERE year ='$ year'AND practice = '''''AND'''AND'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')AS asquery ORDER BY region,fn,ln「; – Vacek

+0

將引發以下錯誤:您的SQL語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在'* FROM rtu_prem_ww WHERE year ='2016'AND practice ='ccv'AND archived!='yes'附近使用正確的語法,並在第1行使用AND' – Vacek