2013-10-11 61 views
4

我有兩個表。 上傳者 - ID,名稱,圖標,視圖 視頻 - ID,上傳者,視頻,視圖SQL ORDER BY Idea

上傳者列用於引用視頻的上傳者。所以,我可以使用sum()函數來統計每個用戶在他的所有視頻中總共有多少個視圖。現在我想通過desc總視圖來訂購這些用戶。

我該怎麼做?繼承人什麼我到目前爲止的代碼...

//Retrieve data from the database 
$fkbar = mysql_query("SELECT * FROM freaks"); 
while($fkrow = mysql_fetch_array($fkbar)) 

//Echo Theme Template on pages 
{ 
    $frkid = $fkrow['id']; 
    $viewq = mysql_query("SELECT SUM(views) AS vw FROM videos WHERE ref1='{$frkid}' OR ref2='{$frkid}' OR ref3='{$frkid}'"); 
    while($viewcnt = mysql_fetch_array($viewq)) 
    {  

     $viewcount = $viewcnt['vw']; 

      echo "<div class='diva' id='{$viewcount}'>"; 
      echo "<div class='inner-diva'><a href='/mobile/freaks/?i={$fkrow['id']}'>"; 
      echo "<img id='{$fkrow['id']}' class='dvBarIco' src='/assets/ico/{$fkrow['icon']}' height='80px'></a></div>"; 
      echo "</div>"; 
    } 
} 
+1

就這麼你知道,你可能對SQL注入開放。你應該使用參數化查詢。 –

+0

謝謝。我只是一個基本的開發人員和季節性設計師,但在這個階段之後,開發團隊的其他成員應該確保我的服務器端代碼的缺陷和不足。 –

+0

嘿......「應該是...... ......沒有人像他們認爲的那樣擁有儘可能多的時間。你應該對自己負責(增加你的能力)和你的客戶(保護他們的數據)來研究這一點。雖然參數化查詢不是_hard_,但查找所有實例並「修復」它們需要時間。讓自己對聘用你的公司更有價值 - 找出他們正在使用的庫,並使用它來實現你的查詢。 –

回答

1

只是用骨料添加ORDER BY條款:

ORDER BY SUM(views) DESC 

從你的評論,你可以使用子查詢中第一個這樣做的排序:

SELECT * 
FROM freaks f 
ORDER BY (SELECT SUM(views) FROM videos WHERE ref1=f.id OR ref2=f.id OR ref3=f.id) DESC 

您還可以用加入做到這一點,但OR可以使複雜的事情:

SELECT f.*, COALESCE(v.views, 0) total_views 
FROM freaks f 
LEFT OUTER JOIN (
    SELECT SUM(views) views, id 
    FROM (
     SELECT views, ref1 AS id 
     FROM videos 
     UNION ALL 
     SELECT views, ref2 AS id 
     FROM videos 
     UNION ALL 
     SELECT views, ref3 AS id 
     FROM videos 
    ) x 
    GROUP BY id 
) v ON f.id = v.id 
ORDER BY total_views DESC 
+0

如果你看到最後一組回聲語句,他們從第一個查詢中提取信息。但第一個查詢不是由另一個表中的視圖總和排序的;基本上我想排序第一freaks.table與總和(視圖)從 –

+0

第二videos.table謝謝。子查詢完美無瑕!每次我問一個問題,我都會學到新東西。我甚至不知道子查詢。 –

1

嘗試使用子查詢來獲得總和,這將結合您的查詢併爲您提供跨兩個表而不是第二個查詢每次排序的選項。

$fkbar = mysql_query(
"SELECT 
    (SELECT SUM(views) AS vw FROM videos WHERE videos.ref1=freaks.id OR videos.ref2=freaks.id OR videos.ref3=freaks.id) as total_views, 
* FROM freaks ORDER BY total_views DESC");