Задавайте вопросы, мы ответим
Вы не зашли.
откройте прикреплённый файл с изображением для структуры.
надо:
1. получить сумму honor для каждого uuid, игнорируя honor от всех sim_pos, где sim_approval не равен 1.
2. вывести таблицу сортированную по сумме honor из первого пункта, состоящую из name, honor, rank, reap, kills, craft
текущий неправильный запрос: "SELECT avatars.name, SUM(score.honor) AS honor_sum, avatars.rank, avatars.reap, avatars.kills, avatars.craft FROM avatars,score,sims WHERE sims.sim_pos=score.sim_pos AND sims.sim_approval='1' GROUP BY score.uuid ORDER BY honor_sum"
PHP код:
function sql_call($message)
{
if ($message=mysql_query($message))
return $message;
else
die('Invalid query: '.mysql_error());
}
echo
("
<table width='500' border='1'>
<tr>
<th scope='col'>name</th>
<th scope='col'>honor</th>
<th scope='col'>rank</th>
<th scope='col'>reap</th>
<th scope='col'>kills</th>
<th scope='col'>craft</th>
</tr>
");
$sql_query_result = sql_call("SELECT avatars.name, SUM(score.honor) AS honor_sum, avatars.rank, avatars.reap, avatars.kills, avatars.craft FROM avatars,score,sims WHERE sims.sim_pos=score.sim_pos AND sims.sim_approval='1' GROUP BY score.uuid ORDER BY honor_sum");
//$sql_query_result = sql_call("SELECT * FROM avatars");
while ($sql_data_row = mysql_fetch_row($sql_query_result))
{
echo '<tr>';
foreach($sql_data_row as $array_element_value)
echo "<td>$array_element_value</td>";
echo '</tr>';
}
echo '</table>';
ссылка с результатом: http://www.scilabsl.com/ имеется тестовая информация, но возвращается неадекватный массив.
ещё вопрос: как лучше хранить вектора и другие массивы в mysql ? для моей задачи у меня массив идентификатора сима (sim_pos) состоит из 2-х mediumint. просто как-то хранить в строке не эстетично чтоли... а со spatial point геморой какой-то.
пример значения sim_pos: 200448, 303360. я конечно умножу 200448 на 1000000 и прибавлю 303360, но часто такой подход просто не катит.
пояснения: sim - симулятор (игровой сервер), uuid - ключ игрока, sim_pos - уникальный идентификатор игрового сервера, honor - заработанные игроком очки, sim_approval - будет ли официально учитываться заработанный на этом симе honor и каждую неделю сбрасываясь увеличивать rank.
в таблице "score" содержится honor заработанный разными uuid на разных sims
ключи в таблице "score" - sim_pos и uuid.
бывшие WoWеры поймут о чём я XD
Отредактированно FadeOut (09.03.2012 15:12:25)
Неактивен
надо:
1. получить сумму honor для каждого uuid, игнорируя honor от всех sim_pos, где sim_approval не равен 1.
Неактивен
О БОЖЕ! оно работает!
кланяюсь в ступни.
большое спасибо.
обязательно разберу всё по кусочкам и пойму каждую мелочь.
---
кстати, про то что запрос #1 будет работать долго - это потому что для каждого элемента будет срабатывать WHERE и расчитывать таблицу заапрувленых симов... походу ( я просто параллельно гуглил и пришёл к тому же результату в этом запросе )
---
разобрался в каждом аспекте, переписал через join, вроде всё работает
$sql_query_result = sql_call(
"SELECT avatars.name, t.honor_sum, avatars.rank, avatars.reap, avatars.kills, avatars.craft
FROM avatars JOIN
(
SELECT uuid, SUM(honor) AS honor_sum FROM score JOIN
(
SELECT sim_pos FROM sims WHERE sim_approval='1'
)
a ON a.sim_pos=score.sim_pos
GROUP BY uuid
)
t ON t.uuid=avatars.uuid ORDER BY honor_sum DESC");
да, стиль у меня паскальный c: всё пишу аля begin end со спамом новых строчек
Отредактированно FadeOut (09.03.2012 19:12:12)
Неактивен