• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

[SQL] How to get 2x value (from different storage) and divide it?

ligus

New Member
Joined
Apr 26, 2010
Messages
253
Reaction score
0
Hello, I want to divide value from storage 8544 by value from storage 8541

You can check this: http://vpx.pl/i/2014/07/18/storage.jpg
For example player Ackerman - in result I want to have 94/3 = 31

I tried
Code:
SELECT `name`,`key`,`value` FROM `players`,`player_storage` WHERE (`key` = 8541 AND players.id = player_storage.player_id) OR (`key` = 8544 AND players.id = player_storage.player_id)
But I do not have idea how I can divide it.

I tried also
Code:
SELECT ((SELECT `value` FROM `players`,`player_storage` WHERE `key` = 8541 AND players.id = player_storage.player_id)/(SELECT `value` FROM `players`,`player_storage` WHERE `key` = 8544 AND players.id = player_storage.player_id)) as diff

but:
#1242 - Subquery returns more than 1 row

Does anyone have an idea?
 
Code:
SELECT p.name, ps.key, ps.value FROM players AS p LEFT JOIN player_storage AS ps ON ps.player_id = p.id WHERE ps.key IN(8541, 8544);

Edit: Sorry, I did not completely read your thread, was just looking at the queries themselves. Just noticed you wanted to divide your values.
 
Last edited:
For a specific character:
Code:
SELECT p.name, (ps1.value / ps2.value) AS value FROM players AS p JOIN player_storage AS ps1 ON (ps1.key = 8544 AND ps1.player_id = p.id) JOIN player_storage AS ps2 ON (ps2.key = 8541 AND ps2.player_id = p.id) WHERE p.name = 'CHARACTER NAME HERE' LIMIT 1;
For all of them:
Code:
SELECT p.name, (ps1.value / ps2.value) AS value FROM players AS p JOIN player_storage AS ps1 ON (ps1.key = 8544 AND ps1.player_id = p.id) JOIN player_storage AS ps2 ON (ps2.key = 8541 AND ps2.player_id = p.id);
 
Last edited:
In database it works perfect! :)
I don't understand but there is something wrong when I want to use this in PHP.

Code:
<?PHP
if(file_exists($f) && filemtime($f) > (time() - $cache_sec))
    $main_content = file_get_contents($f);
else
{
    mysql_pconnect($config['server']['sqlHost'], $config['server']['sqlUser'], $config['server']['sqlPass']) or die('MySQL connection error.');
    mysql_select_db($config['server']['sqlDatabase']);

    $main_content .= '
    <table border="0" cellpadding="4" cellspacing="1" width="100%">
        <tr align="center" style="height: 22px; background-image: url(\'layouts/elemental/images/news/newsheadline_background.gif\');">
        <td height="22" width=10% class="white" style="text-align: center; font-weight: bold;">Rank</td>
        <td height="22" class="white" style="text-align: center; font-weight: bold;">Name</td>
        <td height="22" width =22% class="white" style="text-align: center; font-weight: bold;">Result</td>
        </tr>';
  
    $i = 1;
    $pd = mysql_query('SELECT p.name, ps1.value / ps2.value AS value FROM players AS p JOIN player_storage AS ps1 ON ( ps1.key =8544 AND ps1.player_id = p.id ) JOIN player_storage AS ps2 ON ( ps2.key =8541 AND ps2.player_id = p.id ) ORDER BY  `value` DESC LIMIT 0,30');

    if(mysql_num_rows($pd) != 0)
    {
        while($pld = mysql_fetch_array($pd))
        {
            $a = mysql_query('SELECT name FROM players WHERE id='.$pld['player_id'].' AND group_id < 4');
            if(mysql_num_rows($a) != 0)
            {
                $a = mysql_fetch_array($a);
                                    if(is_int($nr_gracza / 2))
                        $bgcolor = $config['site']['lightborder'];
                    else
                        $bgcolor = $config['site']['darkborder'];
                    $nr_gracza++;
                    $main_content .= '<TR BGCOLOR="'.$bgcolor.'">

                    <td align="center">'.$i.'.</td>
                    <td height ="22"><b><A style="text-decoration: none;" href="?subtopic=characters&name='.htmlspecialchars($a['name']).'"><center>'.$a['name'].'</center></a></b></td>
                    <td><center>'.$pld['value'].'</center>                  
                    </td>          
                </tr>';
                $i++;
            }  
        }
    }
    else
        $main_content .= '<tr BGCOLOR="'.$config['site']['darkborder'].'" class="Even"><td colspan ="3" height="24">&nbsp;No one has died yet.</td></tr>';
    $main_content .= '</table><br><br>';          
}
?>


There is 30x error
Code:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\pages\top.php on line 25


25 line: if(mysql_num_rows($a) != 0)
 
In database it works perfect! :)
I don't understand but there is something wrong when I want to use this in PHP.


There is 30x error
Code:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\pages\top.php on line 25

It means that the mysql_num_rows() function is need to count from an result, now $a just return true/false.
 
You don't need that secondary SQL statement, you can fetch all the required information from the one I provided you with.
Code:
<?PHP
if(file_exists($f) && filemtime($f) > (time() - $cache_sec))
    $main_content = file_get_contents($f);
else
{
    mysql_pconnect($config['server']['sqlHost'], $config['server']['sqlUser'], $config['server']['sqlPass']) or die('MySQL connection error.');
    mysql_select_db($config['server']['sqlDatabase']);

    $main_content .= '
    <table border="0" cellpadding="4" cellspacing="1" width="100%">
        <tr align="center" style="height: 22px; background-image: url(\'layouts/elemental/images/news/newsheadline_background.gif\');">
        <td height="22" width=10% class="white" style="text-align: center; font-weight: bold;">Rank</td>
        <td height="22" class="white" style="text-align: center; font-weight: bold;">Name</td>
        <td height="22" width =22% class="white" style="text-align: center; font-weight: bold;">Result</td>
        </tr>';
    $i = 1;
    $pd = mysql_query('SELECT p.name, ps1.value / ps2.value AS value FROM players AS p JOIN player_storage AS ps1 ON ( ps1.key =8544 AND ps1.player_id = p.id ) JOIN player_storage AS ps2 ON ( ps2.key =8541 AND ps2.player_id = p.id ) WHERE p.group_id < 4 ORDER BY  `value` DESC LIMIT 0,30');

    if(mysql_num_rows($pd) != 0)
    {
        while($pld = mysql_fetch_array($pd))
        {
            //$a = mysql_query('SELECT name FROM players WHERE id='.$pld['player_id'].' AND group_id < 4');
            //if(mysql_num_rows($a) != 0)
            //{
                //$a = mysql_fetch_array($a);
                                    if(is_int($nr_gracza / 2))
                        $bgcolor = $config['site']['lightborder'];
                    else
                        $bgcolor = $config['site']['darkborder'];
                    $nr_gracza++;
                    $main_content .= '<TR BGCOLOR="'.$bgcolor.'">

                    <td align="center">'.$i.'.</td>
                    <td height ="22"><b><A style="text-decoration: none;" href="?subtopic=characters&name='.urlencode($pld['name']).'"><center>'.$pld['name'].'</center></a></b></td>
                    <td><center>'.$pld['value'].'</center>                 
                    </td>         
                </tr>';
                $i++;
            //} 
        }
    }
    else
        $main_content .= '<tr BGCOLOR="'.$config['site']['darkborder'].'" class="Even"><td colspan ="3" height="24">&nbsp;No one has died yet.</td></tr>';
    $main_content .= '</table><br><br>';         
}
?>
Also, use urlencode() rather than htmlspecialchars() when you're creating part of a URL (and then decode it with urldecode()).
 
Awesome!
I have one more little thing - when we divide: (value from storage 8544) / (value from storage 8541) and value from storage 8541 is 0... then is it possible to return only value from 8544 or divide by 1?
 
Last edited:
Alter your query, and check if the value is 0 in php, set it to either key1value or key2value.
Code:
SELECT p.name, ps1.value AS key1value, ps2.value AS key2value, ps1.value / ps2.value AS value FROM players AS p JOIN player_storage AS ps1 ON ( ps1.key =8544 AND ps1.player_id = p.id ) JOIN player_storage AS ps2 ON ( ps2.key =8541 AND ps2.player_id = p.id ) WHERE p.group_id < 4 ORDER BY `value` DESC LIMIT 0, 30;
 
I edited query and I did:
Code:
if (($pld['ps2.value']) == 0)
    $xxx = $pld['ps1.value'];
else
    $xxx = round($pld['value'],2);

And now there is nothing everywhere. What am I doing wrong?
 
Back
Top