PHP / MySQL ORDER BY проблема - PullRequest
       2

PHP / MySQL ORDER BY проблема

0 голосов
/ 26 февраля 2011

Нажмите на ссылку "strip'slashes", чтобы увидеть страницу, на которую я ссылаюсь

Как видите, у меня есть эта система голосования для разных определений фраз.В базе данных голоса обрабатываются в собственной таблице, но связаны с таблицей фраз с помощью идентификаторов.Я хочу упорядочить фразы по балансу голосов, но поскольку голоса не являются частью таблицы, которую я выбираю в своем запросе SQL, я не уверен, как это сделать.

I 'Я могу создать баланс голосов, который можно увидеть под каждым определением фразы, но я не могу понять, как ЗАКАЗАТЬ их.Я думал о создании «баланса» и последующем обновлении его в базе данных, когда регистрируется новый голос, но так как вставка голосов находится в таблице «голосования», я не могу вспомнить его при вызове фраз.

Может кто-нибудь указать мне правильное направление, пожалуйста!

Код:

$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 ]

1 голос
/ 26 февраля 2011

Во-первых, ваши данные кажутся слишком сложными ... Работали ли вы с включенным magic_quotes и даже сохраняли данные в базе данных с косой чертой? Если это так, удалите все косые черты из базы данных, отключите magic_quotes И узнайте о sql инъекциях и о том, как защитить себя от этого. Если вы не знаете, о чем я, черт возьми, говорю, тогда ничего не делайте, но отстойно всегда кодировать с 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 голосов
/ 26 февраля 2011

Используйте объединение для вашего запроса, чтобы получить желаемый набор результатов.Это будет работать намного лучше, чем перебирать все записи фраз в 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)

0 голосов
/ 26 февраля 2011

Я не уверен на 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
...