SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.03.2012 12:27:01

FadeOut
Участник
Зарегистрирован: 09.03.2012
Сообщений: 2

Очередной нуб не может решить задачку.

откройте прикреплённый файл с изображением для структуры.

надо:
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)


Прикрепленные файлы:
Attachment Icon table structure.jpg, Размер: 153,823 байт, Скачано: 327

Неактивен

 

#2 09.03.2012 17:05:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Очередной нуб не может решить задачку.

надо:
1. получить сумму honor для каждого uuid, игнорируя honor от всех sim_pos, где sim_approval не равен 1.

SELECT uuid, SUM(score.honor) AS honor_sum FROM score WHERE sim_pos in (select sim_pos from sims where sim_approval='1' ) GROUP BY score.uuid ORDER BY honor_sum;
Этот запрос будет работать долго (если только вы не используете mariaDB 5.3), если возможно, то лучше переписать его через join, иначе разбить на 2.


2. вывести таблицу сортированную по сумме honor из первого пункта, состоящую из name, honor, rank, reap, kills, craft

select avatars.name, t.honor_sum, avatars.rank, avatars.reap, avatars.kills, avatars.craft from avatars join
(SELECT uuid, SUM(score.honor) AS honor_sum FROM score WHERE sim_pos in (select sim_pos from sims where sim_approval='1' ) GROUP BY score.uuid ORDER BY null) t on t.uuid=avatars.uuid ORDER BY honor_sum

Неактивен

 

#3 09.03.2012 17:49:25

FadeOut
Участник
Зарегистрирован: 09.03.2012
Сообщений: 2

Re: Очередной нуб не может решить задачку.

О БОЖЕ! оно работает!
кланяюсь в ступни.

большое спасибо.
обязательно разберу всё по кусочкам и пойму каждую мелочь.

---

кстати, про то что запрос #1 будет работать долго - это потому что для каждого элемента будет срабатывать WHERE и расчитывать таблицу заапрувленых симов... походу ( я просто параллельно гуглил и пришёл к тому же результату в этом запросе big_smile )

---

разобрался в каждом аспекте, переписал через 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)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson