2011-02-26 50 views
0

Click the "strip'slashes'" link to see the page I'm referring toPHP/MySQL的ORDER BY問題

正如你所看到的,我有這樣的投票系統設置的短語有不同的定義。在數據庫中,投票將在他們自己的表格中處理,但通過ID鏈接到「短語」表格。我想按照票數的平衡排列詞組,但由於選票不是我在SQL查詢中選擇的表格的一部分,我不知道如何去做。

我能夠創建票數的平衡,可以在每個詞組定義下看到,但我無法弄清楚如何對它們進行排序。我考慮創建'平衡',然後在註冊新投票時將其更新到數據庫中,但由於投票插入到'投票'表中,所以在回憶短語時我不記得它。

請有人指點我在正確的方向請!

代碼:

$query="select id, date, original, inotherwords, author from phrases where original='".$head."'"; 
$result=mysql_query($query); 
$thenumber = 1; 

echo '<h2>Original Phrase</h2>'; 
echo '<p>'.stripslashes($head).'</p><br>'; 
echo '<h2>In Other Words</h2>'; 
while($row = mysql_fetch_array($result)){ 
    $pv = $pulse->countUpVotes($row['id']); 
    $nv = $pulse->countDownVotes($row['id']); 
    $balance = ($pv - $nv); 


    echo '<p>'.$thenumber.'. '.stripslashes(nl2br($row['inotherwords'])).' - '; 
    echo $pulse->voteHTML($row['id']); 
    echo '</p>'; 
    echo '<p><b>Author</b> - '.stripslashes($row['author']).' - submitted on '.$row['date'].'</p>'; 
    echo 'Balance - '.$balance.'<br><br>'; 

    $thenumber++; 
} 

回答

1

首先,你的數據似乎SOOO麻煩......你一直與magic_quotes開啓,你甚至在它斜線數據庫中保存的數據?如果是這樣,請清除數據庫中的所有斜槓,禁用magic_quotes並瞭解sql injection以及如何保護自己免受此影響。如果你不知道我到底在說什麼,那麼不要做任何事情,但它總是編碼會很糟糕stripslashes(...)

第二...我認爲每個短語的選票都會被計算在內另一個表在同一個數據庫中,對嗎?如果是這樣,你需要加入兩個表中查詢,所以你就可以通過數據的票表

SELECT p.*, v.upvotes, v.downvotes, (v.upvotes - v.downvotes) as balance 
FROM phrases p 
LEFT JOIN votes v ON p.id = v.phrase_id 
WHERE ... 
ORDER BY balance DESC 
+0

你需要'GROUP BY'結果即可。 '$ query =「SELECT p。*,SUM(v.vote_value)AS balance從短語p LEFT JOIN pulse_votes v ON p.id = v.item_id WHERE p.original =」'。$ head。'「GROUP BY p。 ID ORDER BY balance DESC' – 2011-02-26 14:15:55

+0

我想你幾乎讓我按這個排序...唯一的問題是,沒有單獨的列投票,只有一個(vote_value),其中-1爲負面投票,1如果我在一個共享主機上,我無法關閉它,我無法訪問php.ini。數據庫儘管如此,這一切都很好,我已經修復了! – nutman 2011-02-26 14:16:32

+0

$ query =「SELECT p。*,v.vote_value,SUM(v.vote_value)as balance FROM phrase p LEFT JOIN pulse_votes v ON p.id = v.item_id WHERE p.original ='「。$ head。」'ORDER BY balance DESC「;我嘗試了上面的方法,但它只返回了一個結果,但是如果我刪除SUM(v.vote_value)作爲餘額,那麼我得到原始的結果,只是沒有訂購 – nutman 2011-02-26 14:17:09

0

我不是100%肯定我明白這個問題...但我猜你想要的是做一個JOIN

例如:

SELECT p.id, p.date, p.original, p.inotherwords, p.author, v.vote 
FROM phrases p 
LEFT JOIN votes v ON v.id_phrase = p.id 
WHERE original = ... 
ORDER BY v.vote DESC 
0

使用加入您的查詢,以獲得所需的結果集訂購。它會比循環遍歷php中的所有「短語」記錄更好。

SELECT 
    p.id, p.date, p.original, p.inotherwords, p.author 
FROM 
    phrases p 
LEFT JOIN 
    votes v on (v.id_phrase = p.id) 
WHERE 
    original='".$head."'" 
ORDER BY 
    v.vote DESC 

(未經測試)