I asked a question yesterday that was quite onerous, so I have been
working out some of the details today, and would like to re-post my
question under a different light.

I have a table called data__ProcessedDataFrames that can grow to be
gigantic, and I need to speed up the query for pulling the data out.

What I'm trying to avoid is doing multiple queries on that table because
it is so big.  In my query I have a WHERE statement that looks like:
 WHERE P.test_id=tid
 AND payload_time <= ptime

where P is data__ProcessedDataFrames and tid is the test_id I'm looking at
and ptime is the payload_time that I'm looking at.  The problem with it is
I don't always know the exact payload_time, just that I want the
MAX(payload_time) < ptime.  I can't seem to get it right.  If I put the
MAX aggregate on payload_time, it returns the max payload_time but not the
data associated with that max payload_time.  So essentially I'm trying to
force my query to return the row that is associated with this max
payload_time without doing another query on the table to get the exact
payload_time.  Here is the table structure for data__ProcessedDataFrames:

mysql> desc data__ProcessedDataFrames;
+------------------------+------------------+------+-----+---------+----------------+
| Field                  | Type             | Null | Key | Default | Extra
         |
+------------------------+------------------+------+-----+---------+----------------+
| processed_id           | int(10) unsigned | NO   | PRI | NULL    |
auto_increment |
| top_level_product_name | varchar(255)     | YES  | MUL | NULL    |      
         |
| test_id                | int(10) unsigned | YES  | MUL | NULL    |      
         |
| payload_time           | double           | YES  | MUL | NULL    |      
         |
| universal_time         | double           | YES  |     | NULL    |      
         |
| processed_data         | mediumblob       | YES  |     | NULL    |      
         |
+------------------------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql>


Here is the SP:
CREATE PROCEDURE `getElement`(IN id INT UNSIGNED,
                              IN ptime DOUBLE,
                              IN tid VARCHAR(255),
                              IN exact_time TINYINT)
BEGIN
   IF(ptime < 1) THEN
      SELECT MAX(ROUND(payload_time,6)) FROM data__ProcessedDataFrames
WHERE test_id=tid INTO ptime;
   END IF;
   SELECT
      J.product_id,
      P.processed_id,
      MAX(ROUND(P.payload_time,6)) as payload_time,
      P.top_level_product_name,
      SUBSTR(
         BINARY(processed_data),
         FLOOR(J.product_offset/8)+1,
         CEIL(J.product_length/8)) as substring,
         (SELECT HEX(substring)) as raw_data,
         (SELECT toString(
            substring,
            round(char_length(raw_data)/2,0),
            data_type,
            (SELECT attribute_value FROM
               config__DataProductAttributes
                  WHERE attribute_name='FormatString'
                  AND config__DataProductAttributes.product_id=
J.product_id),
            product_offset % 8,
            (product_length+(product_offset % 8)) % 8,
            product_length,
            byte_order,
            (SELECT attribute_value FROM
               config__DataProductAttributes
                  WHERE attribute_name = 'ConvParams'
                  AND config__DataProductAttributes.product_id =
J.product_id))) as converted_data,
         (SELECT enum_name FROM
            config__DataProductEnumConversions
               WHERE product_id=J.product_id
               AND enum_value =converted_data) as enumerated_data,
         (SELECT metricTest(converted_data,
            (SELECT xmlTestMetric FROM
               test__TestMetrics
                  WHERE product_id = J.product_id))) as test_metric
      FROM data__ProcessedDataFrames
               P INNER JOIN
                  (SELECT E.product_id,
                          top_level_product_name,
                          product_length,
                          product_offset,
                          data_type,
                          byte_order
                    FROM display__DataProducts_in_Element
                          E INNER JOIN config__DataProducts D ON
E.product_id=D.product_id
                          WHERE E.element_id=id) J
               ON P.top_level_product_name=J.top_level_product_name
                   WHERE P.test_id=tid
                   AND payload_time <= ptime
                   GROUP BY J.product_id ;
END;;


You can see here at the end I did a GROUP BY on J.product_id (there can be
multible product_ids) and one of the return values is:
MAX(ROUND(P.payload_time,6)) as payload_time,

Well this max does not force the processed_data from that row to be
returned, I get processed_data from another row because of the GROUP BY

Any suggestions?

David Godsey


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to