1

Minecraft のトップ リストの情報を表示するために 3 つのテーブルを調べる必要があるコードを取得しました。表は次のとおりです。

サーバー

id | user_id | name | information | websitename | websiteurl | postdate.. etc

これは、サーバー名、Web サイト情報 (サーバーの完全な説明) などを含むメイン テーブルです。

投票

id | server_id | username | ipaddress | votetimestamp

ウェブサイトでは、プレイヤーが 24 時間ごとに投票できるようにしています。すべての投票は、ゲーム内のユーザー名 (ユーザー名)、サーバー ID、投票時刻とともにこのテーブルに挿入されます。

ピング

id | server_id | min_player | max_player | motd | pingtimestamp

このテーブルは、fsock を使用して Web サーバーで実行されている CronJobs を使用して、10 分ごとに別のスクリプトによって更新されます。これを行うことで、サーバーがオフラインかオンラインか、オンラインのプレイヤーの数、同時にオンラインにできるプレイヤーの数を知ることができます。

インデックス ページで、3 つのテーブルすべてからデータを Web ページに引き出し、すべてのサーバーをデータベースの順序で表示するスクリプトを取得しました。

投票テーブルですでに投票を取得したすべてのサーバーを引き出すことができますが、まだ投票を受け取っていないサーバーがある場合、それはリストされません。これは私が使用するSQLコードです。

SELECT DISTINCT(ping.server_id), COUNT(vote.server_id) AS count, servers.id,
       servers.name, servers.server_ip, ping.min_player,ping.max_player,ping.motd
  FROM servers,vote,ping
 WHERE servers.id = vote.server_id
   AND servers.id = ping.server_id
 GROUP BY servers.id
 ORDER BY count DESC
 LIMIT $start, $per_page

これは十分に簡単だと確信していますが、今いくつか試してみましたが、実際には何も機能していないようです。この時点で、SQL は私の得意分野ではないことを述べておくことをお勧めします。

編集 文字列の「DISTINCT」を削除しようとしましたが、何らかの理由で、サーバーを複数回表示しているすべてのサーバーの複数の行が返されます。すべてのサーバーは 1 回だけ表示され、最も多くの票を獲得したサーバーの後に上から下に並べ替えられます。

4

1 に答える 1

0

まず、From 句で単にテーブルをリストするだけのコンマ区切り構文を使用しないでください。代わりに Join 構文を使用してください。サンプルの入力と予想される出力を示していただけると助かります。投票があるかどうかに関係なく、すべてのサーバーが必要であると述べた場合、おそらく左結合を使用する必要があることを意味します。

Select servers.id
    , Count(vote.server_id) As cnt
    , servers.name
    , servers.server_ip
    , Min(ping.min_player) As min_player
    , Max(ping_ping.max_player) As max_player
    , Min(ping.motd) As Min_Motd
From servers
    Left Join votes
        On votes.server_id = servers.id
    Left Join ping
        On ping.server_id = servers.id
Group By servers.id
    , servers.name
    , servers.server_ip
    , ping.server_id

同じ値に対してテーブルに複数の行がある場合、テーブルの構造と目的、pingまたは結果の性質が明確ではありませんでした。上記の例では、 、 、およびに使用する集約関数について推測しました。さらに、すべてのサーバーの行が本当に必要であり、必ずしもテーブルに値を含む行が必要であるとは限らないと想定したため、 to からの Left Join を使用しました。pingservers.idping.min_playerping.max_playerping.motdpingserversping

さらに、ifservers.idserversテーブルの主キーであり、MySQL を使用しているため、Group By ですべての列を列挙する必要はありません (ただし、他のデータベース製品では列挙する必要があります)。が主キーかどうかは明言されていなかったのでservers.id列挙した。

于 2012-11-14T23:05:27.053 に答える