MySQL Query Guidance Needed

Hill, Greg grhill at corp.untd.com
Mon Sep 25 14:47:37 MDT 2006


Maybe I'm misunderstanding something in your query, but it seems you
could just drop the GROUP BY to get a total sum, or GROUP BY player_id
to get sum per player (and drop the where clause).  I'm assuming mails =
kills, but you weren't so clear on that.  And, I didn't spend too long
looking at it, so I might be discounting something.  Also, since you
don't care about non-existant entries in the 'lost' table (i.e., if
nothing was lost, it's zero, so ignore it), you could do a JOIN instead
of LEFT JOIN and you'd never have nulls to deal with.

Greg

> -----Original Message-----
> From: plug-bounces at plug.org [mailto:plug-bounces at plug.org] On Behalf
Of
> Matthew Walker
> Sent: Monday, September 25, 2006 2:05 PM
> To: plug at plug.org
> Subject: MySQL Query Guidance Needed
> 
> I'm trying to do a rather tricky query in MySQL, and I'm a bit
stumped. I
> know I can do what I want if I just offload the work to PHP, but for
the
> sake of the learning, I'm trying to do it inside SQL.
> 
> A bit of background: This is a 'point tracking' site for PVP in EVE
> Online. It parses kill reports, and stores them in the database. Now
I'm
> trying to get it to tally up points per kill, based on the value of
the
> items destroyed.
> 
> Relevant Schema:
> 
> CREATE TABLE `items` (
>   `id` int(11) NOT NULL auto_increment,
>   `typeName` char(100) default NULL,
>   `graphicID` int(11) default NULL,
>   `basePrice` double default NULL,
>   `techLevel` tinyint(3) unsigned NOT NULL,
>   PRIMARY KEY  (`id`),
>   UNIQUE KEY `typeName` (`typeName`),
>   KEY `graphicID` (`graphicID`)
> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
> 
> -- --------------------------------------------------------
> 
> CREATE TABLE `lost` (
>   `mail_id` bigint(20) unsigned NOT NULL,
>   `item_id` bigint(20) unsigned NOT NULL,
>   `quantity` bigint(20) unsigned NOT NULL,
>   `location` enum('cargo','fit','drone_bay') NOT NULL
> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
> 
> -- --------------------------------------------------------
> 
> CREATE TABLE `mails` (
>   `id` bigint(20) unsigned NOT NULL auto_increment,
>   `player_id` bigint(20) unsigned NOT NULL,
>   `corporation_id` bigint(20) unsigned NOT NULL,
>   `alliance_id` bigint(20) unsigned NOT NULL,
>   `ship_id` bigint(20) unsigned NOT NULL,
>   `system_id` bigint(20) unsigned NOT NULL,
>   `timestamp` datetime NOT NULL,
>   `hash` varchar(32) NOT NULL,
>   `mail` longtext NOT NULL,
>   PRIMARY KEY  (`id`)
> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
> 
> I've got a query that does most of the work of generating the cost of
all
> of a person's losses:
> 
> SELECT IFNULL(SUM(items.basePrice * lost.quantity * IF(items.techLevel
>
> 1, 10, 1)), 0)+(ships.basePrice * IF(ships.techLevel > 1, 10, 1)) AS
> totalValue FROM mails LEFT JOIN lost ON (lost.mail_id=mails.id) LEFT
JOIN
> items ON (lost.item_id=items.id) INNER JOIN items AS ships ON
> (mails.ship_id=ships.id) WHERE mails.player_id=6 GROUP BY mails.id
> 
> However, this returns 1 row per kill, and I would like to get it to
return
> simply one value, that is a total of all the losses. Simple to do in
PHP
> with what I have, but I can't find a way to do it directly in the SQL.
> 
> I've tried SUM()'ing a subselect, but that returns null, so I guess I
> don't understand subselects. :)
> 
> Oh, and flame my language/DB choice all you want. I know them, and
they're
> good enough for me. If there isn't a way to do this in-db, I'll
survive
> with doing it in the PHP.
> 
> Thanks.
> --
> Matthew Walker
> Kydance Hosting & Consulting
> LAMP Specialist
> 
> /*
> PLUG: http://plug.org, #utah on irc.freenode.net
> Unsubscribe: http://plug.org/mailman/options/plug
> Don't fear the penguin.
> */



More information about the PLUG mailing list