2015-05-03 71 views
0

它採用mysql而不是mysqli/pdo使用舊代碼,所以不要擔心這個,我以後會更新該查詢。如何以更清晰的方式執行這些MySQL子查詢?

雖然我目前的方法工作,我敢肯定有這樣做,而不是查詢和3子查詢的更清潔的方式。我主要想學習如何更好地增強我的查詢並儘量減少它們的數量。
我想要做的是

  1. echo出每個日期的日期在那個特定的一天,在頂部
  2. 顯示器所顯示的條目數爲每個用戶的所有數據用戶旁邊
  3. 對於每個日期,在數據的上述2個比特的底部,顯示用戶/ s的條目的最高數目

    $query = mysql_query('SELECT * FROM entries GROUP BY DATE(dt)'); 
    
    $g = 0; 
    
    while ($row = @mysql_fetch_array($query)) 
    { 
    
        $group[$g] = date('y-m-d', strtotime($row['dt'])); 
        echo $group[$g] . "<br />"; 
    
        //display the person's name for today with their count 
        $dayquery = mysql_query('SELECT *, COUNT(username) as total FROM entries WHERE DATE(dt) = "'.$group[$g].'" GROUP BY username ORDER BY COUNT(username) DESC'); 
         while ($today = @mysql_fetch_array($dayquery)) 
         { 
          echo $today['first_name'] . " | " . $today['total'] . "<br />"; 
         } 
    
         //display the highest count for today 
         $topquery = mysql_query('SELECT COUNT(username) as highest FROM entries WHERE DATE(dt) = "'.$group[$g].'" GROUP BY username ORDER BY COUNT(username) DESC LIMIT 1'); 
          while ($toptoday = @mysql_fetch_array($topquery)) 
          { 
           echo "Highest today: " . $toptoday['highest'] . "<br /><br />" ; 
          } 
    
          //display the users with the highest count for today 
          echo "Highest users: "; 
          $userstopquery = mysql_query('SELECT *, COUNT(username) as total FROM entries WHERE DATE(dt) = "'.$group[$g].'" AND COUNT(username) = "' . $toptoday['highest'] . '" AND GROUP BY username'); 
           while ($topusers = @mysql_fetch_array($userstopquery)) 
           { 
            echo $topusers['first_name'] . "<br />" ; 
           } 
    
        $g++; 
    
    } 
    

我有麻煩的是,當我嘗試和減少這些子查詢和使用MAX它只會輸出最高計數但不是所有的每個日期,這正是我需要的,包括用戶的輸出/ s的數據這一天的最多條目。

+0

簡單。請參閱JOIN。但第一個查詢(可能)是荒謬的。 – Strawberry

+0

那麼你可以從查詢1的第一個或最後一排得到的答案查詢2,這取決於你如何查詢1同樣的回答結果進行排序,以查詢3在查詢1的結果。因此,假設查詢1您可以完全擺脫查詢2和3的作品 – RiggsFolly

+0

@Strawberry如何在此實例中使用JOIN進行清理? –

回答

0

你可以像這樣的東西開始。請注意,我沒有使用PHP的mysql_ API,因爲它已在3年或4年前棄用...

require('path/to/mysqli/connection/stateme.nts'); 

$array = array(); 

$query = " 
SELECT e.dt 
    , e.username 
    , COUNT(*) ttl 
    FROM entries e 
GROUP 
    BY e.dt 
    , e.username 
ORDER 
    BY e.dt, ttl DESC; 
"; 


$result = mysqli_query($conn,$query); 

while ($row = mysqli_fetch_assoc($result)) 
     { 
      $array[] = $row; 
     } 

print_r($array); 
+0

哇 - 謝謝草莓!如果我現在循環播放數據,那麼它會爲我提供按天分隔的數據以及當天的頂級用戶?如果不是,將很高興看到你將如何去做。一個查詢中的所有內容都很混亂! –

+0

是的。每天的第一個結果將是最高的。 – Strawberry

+0

不幸的是,只打印出所有數據作爲數組,但不顯示每天的用戶名和他們的計數。每天的第一個結果顯示ttl爲1,但這不正確,因爲它不是所有條目的計數。它應該顯示的是:'[date]
[username] | [這一天的計數],[下一個用戶名] | [計數這一天]'使得對於每個天,然後每天也與顯示用戶/ s的最計數像[日期]
[用戶名]和[用戶名]''大多數項那一天。 –

相關問題