9

ユーザーが何かに投票したか (太字で)、まだ投票していないか (太字ではない) を区別できるようにしたいと考えています。

例えば:

       投稿に
投票しました 投票に投票しませんでした:   77 ↑ ↓ 12 ↑ ↓

私のデータベースのセットアップ方法は次のとおりです。

イントロ

メッセージが含まれています

    message_id イントロ user_id up_vote
     10 がポスト 5 77 に投票しました
     11 5 に投票なし 12

投票

投票を含む

    Voting_id message_id_fk user_id
     18 10 5   
     19 10 3     

ユーザー

ユーザー名が含まれています

    first_name user_id
     ボブ 5

if statementデータベースに適切にクエリを実行してから、投票された投稿と投票されていない投稿を区別する適切なものを作成する方法がわかりません。

これが私がこれまでに持っているものです:

$sql = mysql_query("SELECT * FROM intro
         INNER JOIN users ON intro.user_id = users.user_id
         ORDER BY `up` DESC ");

echo $row['first_name'] . " " .  $row['intro'];

if( ??? ) {
  echo "<strong>" . $row['up_vote'] . "</strong>";
} else {
  echo $row['up_vote'];
}

何か案は?

4

2 に答える 2

4

投票テーブルに左に参加し、対応するアイテムが見つかったかどうかを確認します。

SELECT intro.message_id, intro.intro, intro.user_id, intro.up_vote,
    IF(Voting.user_id IS NULL, 0, 1) AS has_voted
FROM intro
INNER JOIN users ON intro.user_id = users.user_id
LEFT JOIN Voting ON Voting.message_id_fk=intro.message_id
    AND Voting.user_id = 5
ORDER BY `up` DESC 

次にPHPで:

if($row['has_voted'){
    echo "<strong>".$row['up_vote']."</strong>";
}else {
    echo $row['up_vote'];
}

いくつかの説明:

  • LEFT JOINedテーブルの列NULLは、一致する行が見つからなかった場合です。
  • IF()は、最初のパラメーターがtrueと評価された場合に2番目のパラメーターを返す関数であり、それ以外の場合は3番目のパラメーターを返します。SELECT関数として、句で簡単に使用できます
  • 必要な列を明示的に選択することに置き換えましSELECT *た。これはベストプラクティスと見なされ、この場合は列名があいまいなために必要です。
  • もちろん、リテラル5を現在のユーザーIDに置き換える必要があります。プリペアドステートメントを使用するか、次のようにクエリを連結します。"...Voting.user_id = " . intval($current_user_id) . "..."
于 2013-01-28T10:33:56.190 に答える
1

現在ログインしているユーザー (たとえば、user_id = 3 のユーザー) が賛成票を投じた投稿のみを取得したい場合は、次のクエリを使用できます。

SELECT u.first_name,
       m.message_id,
       m.message,
       m.up_vote,
       v.Voting_id
FROM Users u,
     Messages m
LEFT JOIN Voting v ON v.message_id_fk = m.message_id AND v.user_id = 3
WHERE u.user_id = m.user_id;

コードで、適切な手順を使用して、上記の 3 を現在ログインしているユーザーの user_id に置き換えます。

SQL フィドル

このクエリを実行すると、結果に行が追加されていることがわかります。voting_id です。

ユーザーがこの投稿に賛成票を投じた場合投票の ID が表示されますユーザーが賛成票を投じなかった場合、 NULL値が表示されます。

次に、コードでこのフィールドがnull でないことを確認できます。これで完了です。

于 2013-01-25T21:16:02.523 に答える