0

ユーザーごとの投票数を引き出す投票スクリプトがあります。

ユーザーごとの投票数を投票数順に表示する必要があることを除いて、すべてが機能しています。私のデータベース構造を見てください:

エントリ:

UserID, FirstName, LastName, EmailAddress, TelephoneNumber, Image, Status

投票:

item, vote, nvotes

項目フィールドには が含まれvt_img、次に が含まれますUserID。たとえば、vt_img4および 投票 と nvotes の両方に投票数が表示されます。

それらを関連付けて、最も投票数の多い順にユーザーを表示する方法はありますか?

ありがとう

4

5 に答える 5

2

通常の結合ができるように、投票テーブルの構造を変更する必要があります。純粋な userID 列を追加するか、少なくとも他の 2 つの列を連結しないようにすることを強くお勧めします。ID に基づいて、次のようなことを簡単に行うことができます。

select
    a.userID,
    a.firstName,
    b.votes
from
    entries a
        join voting b
            on a.userID=b.userID
order by
    b.votes desc

もう 1 つのオプションは、(1 対 1 の関係の場合) 単純にデータを 1 つのテーブルにマージすることを検討することです。これにより、さらに簡単になります。

現時点では、これは本当にXY問題です。結合することを意図していない 2 つのテーブルを結合する方法を探しています。(恐ろしく、恐ろしい、恐ろしい) 方法はありますが、最良の解決策は、少し余分な作業を行い、データベースを変更することだと思います (データを失わないように、私たちは確かにそれを支援できます)。あなたが今やりたいことを(簡単に)できるようになり、将来やりたいと思う他のすべてのこと(今はわからないこと)もずっと簡単になります。

編集:これは、トリガーを使用して新しい行を挿入する絶好の機会のようです。MySQL トリガーは、特定の定義済みアクションが発生したときにデータベースが実行するアクションです。この場合、メイン テーブルに行を挿入するときに、テーブルに新しい行を挿入する必要があります。美しさは、元のテーブルのデータへの参照を使用してそれを実行できることです。

CREATE TRIGGER Entries_Trigger AFTER insert ON Entries
    FOR EACH ROW BEGIN
        insert into Voting values(new.UserID,0,0);
    END;

これは次のように機能します - 行が Entries テーブルに挿入されると、データベースは行を挿入し (auto_increment ID などを作成します)、すぐにこのトリガーを呼び出し、新しく作成された UserID を使用して挿入します2 番目のテーブル (投票と nvotes のいくつかのゼロと共に)。

于 2012-09-14T08:19:09.490 に答える
0

データベースの設計が不適切です。そのはず:

Voting:

item, user_id, vote, nvotes

アイテム ID とユーザー ID を区切り文字で連結された文字列として同じ列に配置すると、問題が発生するだけです。これはまったくスケーラブルではありません。正規化の基本を調べてください。

于 2012-09-14T08:18:27.747 に答える
0

これを試すことができます:

SELECT *
FROM Entries e
JOIN Voting v ON (CONCAT('vt_img', e.UserID) = v.item)
ORDER BY nvotes DESC

Entriesただし、テーブルの結合フィールドはクエリ時に作成されるため、このクエリは非常に遅くなる可能性があることに注意してください。

直接結合を行うには、フィールドがVoting含まれるようにデータベース構造を変更することを検討する必要があります。UserID

于 2012-09-14T08:18:49.393 に答える
0

テーブルは投票が行われる場所であると考えてEntriesいます(データベーススキーマは私にはあまり意味がありません。もう少しうまく機能するようです)。投票が実際にVotesテーブルにあり、それがユーザーに接続されている場合はUserID、そのテーブルにもフィールドが必要です。いずれにせよ、例は役に立ちます。

テーブルに追加UserIDするVotesと、これがクエリよりもユーザーの投票が保存される場所であるとしましょう

SELECT Users.id, Votes.*,
SUM(Votes.nvotes) AS user_votes
FROM Users, Votes
WHERE Users.id = Votes.UserID
GROUP BY Votes.UserID
ORDER BY user_votes
于 2012-09-14T08:28:56.330 に答える
-1

クエリで ORDER BY を使用する --

SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC
于 2012-09-14T08:17:16.350 に答える