PHP / mySQL ORDER BY问题

时间:2011-02-26 13:18:46

标签: php mysql sql-order-by

Click the "strip'slashes'" link to see the page I'm referring to

正如您所看到的,我为不同的短语定义设置了这个投票系统。在数据库中,投票在他们自己的表格中处理,但是通过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++;  
}

3 个答案:

答案 0 :(得分:1)

首先,您的数据似乎太麻烦了......您是否一直在使用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

答案 1 :(得分:0)

我不是百分百肯定我理解这个问题......但我想你想做的是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

答案 2 :(得分: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

(UNTESTED)