次の機能に問題があります。
function get_organization_score($org_id)
{
$sql1 = "SET @rownum := 0";
$sql2 = "SELECT rank, xp_total FROM (
SELECT @rownum := @rownum + 1 AS rank, g_org.id AS org_id,
(Sum(g_npc.xp) + (Sum(g_npc.level)*128)) AS xp_total FROM g_org
LEFT JOIN g_npc ON g_org.id = g_npc.g_org_id GROUP BY g_org.id
ORDER BY xp_total DESC
) as result WHERE org_id='".$org_id."'";
mysql_query($sql1);
$result = mysql_query($sql2);
$rows = '';
$data = array();
if (!empty($result))
$rows = mysql_num_rows($result);
else
$rows = '';
if (!empty($rows)){
while ($rows = mysql_fetch_assoc($result)){
$data[] = $rows;
}
}
if (empty($data[0]['rank']))
return 1;
return $data[0]['rank'];
}
このコードは、スコアボードに組織のランクを表示するためのものです。たとえば、組織IDを指定すると、そのランク番号がスコアボードに配置されます。
現在の問題は、ランク番号ではなく、組織IDとして関数を呼び出しているID自体を取得することです。
例:get_organization_score(1)の場合、ランク番号を1として取得します。または、get_organization_score(34)を呼び出すと、ランク番号を34として取得します。
ただし、スコアボードでの位置は、左結合によって他のテーブルから取得されたXP量で並べ替えられます。
誰か助けてもらえますか?ご不明な点がございましたらお問い合わせください...
編集:テーブルスキーマとサンプルデータの追加:
CREATE TABLE IF NOT EXISTS `g_org` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`org_name` varchar(255) NOT NULL,
`founded` datetime NOT NULL,
`g_userid` int(255) NOT NULL,
`g_username` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `g_userid` (`g_userid`),
KEY `g_username` (`g_username`(191)),
KEY `g_username_2` (`g_username`),
KEY `org_name` (`org_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=47 ;
INSERT INTO `g_org` (`id`, `org_name`, `founded`, `g_userid`, `g_username`) VALUES
(1, 'test_org_1', '2012-07-04 02:30:56', 1, 'DDD'),
(2, 'test_org_2', '2012-07-04 02:34:57', 2, '777');
--
-- Table structure for table `g_npc`
--
CREATE TABLE IF NOT EXISTS `g_npc` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`g_userid` int(255) NOT NULL,
`g_username` varchar(255) NOT NULL,
`g_org_id` int(255) NOT NULL,
`g_org_name` varchar(255) NOT NULL,
`g_npc_name` varchar(255) NOT NULL,
`level` int(255) NOT NULL,
`xp` int(255) NOT NULL,
`last_update` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `g_userid` (`g_userid`),
KEY `g_username` (`g_username`),
KEY `g_org_id` (`g_org_id`),
KEY `g_org_name` (`g_org_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=181 ;
INSERT INTO `g_npc` (`id`, `g_userid`, `g_username`, `g_org_id`, `g_org_name`, `g_npc_name`, `level`, `xp`, `last_update`) VALUES
(1, 1, 'DDD', 1, 'test_org_1', 'Kinuzehute Doqasi', 4, 155, '2012-11-13 14:30:54'),
(2, 1, 'DDD', 1, 'test_org_1', 'Zabava Qigatagise', 2, 107, '2012-10-30 17:38:12'),
(3, 2, '777', 2, 'test_org_2', 'Roci Vuzoducu', 6, 135, '2012-11-13 23:17:40'),
(4, 2, '777', 2, 'test_org_2', 'Gexoye Zeze', 4, 638, '2012-11-06 02:02:27'),
(5, 2, '777', 2, 'test_org_2', 'Sibalabu Gozi', 9, 285, '2012-11-06 02:02);
関数get_organization_score(2);を呼び出すと 次に、組織IDは2になり、IDが2のテーブル'g_org'にクエリを実行し、テーブル'g_npc'にLEFTJOINを実行して、'g_npc'テーブルの'g_org_id'値2のすべてのエントリを取得して合計します。 'g_npc'テーブルフィールド'xp'からのすべての結果、次にフィールド'xp'DESCによるすべての結果のORDERBY。
次に、@ rownumを含む残りのPHPコードにより、この組織は他の組織の中でランク付けされます。
したがって、組織ID 2による次の関数は、「xp」フィールドのXPが多いため、ランキングが1になります。また、組織ID 1で同じ関数を呼び出すと、番号が小さいため、ランキング番号は2になります。 「XP」フィールド。
基本的に、私は組織のリストを作成したくはありませんが、ランキング番号のみを作成します。他には何もありません。
エンディングには、1つのエントリのランキング番号を取得する必要があるため、WHERE org_id='"。$org_id。"'が必要です。