[EMAIL PROTECTED] wrote:
"Kristen G. Thorson" <[EMAIL PROTECTED]> wrote on 10/14/2005
09:15:21 AM:
I need to convert this query into one without a subquery:
SELECT
r.selector_forms_results_max_points AS points,
r.selector_forms_results_description AS description,
FROM selector_forms_results AS r
WHERE r.selector_forms_id = 1
AND r.selector_forms_results_max_points = (
SELECT DISTINCT
r.selector_forms_results_max_points AS max_points
FROM selector_forms_results AS r
WHERE r.selector_forms_results_max_points <= 12
ORDER BY r.selector_forms_results_max_points DESC LIMIT 1
);
Given selector_forms_results_max_points like below:
9
9
9
11
11
11
11
13
13
and selector_forms_results_max_points target of 12, I want the maximum
of the set of selector_forms_results_max_points that are less than 12.
So in this case, I want all rows where selector_forms_results_max_points
= 11.
I hope I have explained this somewhat clearly. I cannot see how this
can be accomplished with a join, but my sql skills are rudimentary.
Thanks for any help. Table structure and sample data follow.
kgt
Table:
CREATE TABLE `selector_forms_results`
(
`selector_forms_results_id` int(11) NOT NULL
auto_increment,
`selector_forms_id` int(11) NOT NULL default
'0',
`selector_forms_results_description` varchar(255) NOT NULL default
'',
`selector_forms_results_max_points` int(11) NOT NULL default
'0',
PRIMARY KEY
(`selector_forms_results_id`),
KEY `selector_forms_results_max_points`
(`selector_forms_results_max_points`) );
And some sample data:
insert into `selector_forms_results` values (1,1,'Pro1 180',9);
insert into `selector_forms_results` values (2,1,'Iron Eagle 180',9);
insert into `selector_forms_results` values (3,1,'RR 180',9);
insert into `selector_forms_results` values (4,1,'Pro1 200',11);
insert into `selector_forms_results` values (5,1,'Iron Eagle Platinum
200',11);
insert into `selector_forms_results` values (6,1,'RR 200',11);
insert into `selector_forms_results` values (7,1,'IK 200',11);
insert into `selector_forms_results` values (8,1,'Pro1 215',13);
insert into `selector_forms_results` values (9,1,'Iron Eagle Platinum
215',13);
The only advantages of doing this style of query as a subquery is that you
do not need to explicitly create/destroy a temporary table (the engine
does that for you behind the scenes) and you can write it in one
statement. In my experience, the subquery versions are usually noticably
slower. YMMV.
Here is a non-subquery equivalent of your particular query:
CREATE TEMPORARY TABLE tmpMAX (
KEY (`selector_forms_id`)
) SELECT
`selector_forms_id`
, MAX(`selector_forms_results_max_points`) as max_points
FROM `selector_forms_id`
WHERE `selector_forms_results_max_points`<=12
GROUP BY `selector_forms_id`;
SELECT
r.`selector_forms_results_max_points` AS points,
r.`selector_forms_results_description` AS description,
FROM `selector_forms_results` AS r
INNER JOIN `tmpMAX` tm
on r.`selector_forms_id` = tm.`selector_forms_id`
AND r.`selector_forms_results_max_points` = tm.`max_points`
WHERE r.`selector_forms_id` = 1;
DROP TEMPORARY TABLE tmpMAX;
I made this a little less restrictive than your original query so that you
could run the query against other `selector_form_id` values if you wanted.
Instead of using a temporary table, I could have used a single variable to
hold the max value as you only wanted the list for a single value of
`selector_forms_id`.
Does this help?
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
Thank you, this works perfectly for me. I don't even have any questions!
kgt
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]