SUBSELECT QUESTION?
Hi, I have a table SalaryInfo as below Salary | Department | Level 50 | RD| Director 3 | Maintenance| Groundsman ... I want to know what level in each department makes the highest salary and how much that salary is? Something like: SELECT Salary, Level, Department FROM SalaryInfo WHERE Salary=Max(Salary) Would using MySQL 4.1 that has support for nested select help my case? Thanks in advance prashant -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]
Re: SUBSELECT QUESTION?
First of all, you query is not correct and this is not a subselect query. you can try this: SELECT Salary, Level, Department FROM SalaryInfo ORDER BY Salary DESC LIMIT 1; second of all, for subselect MySQL 4.1 can help you. Mojtaba - Original Message - From: Prashant Pai [EMAIL PROTECTED] To: [EMAIL PROTECTED] Sent: Friday, October 24, 2003 12:00 PM Subject: SUBSELECT QUESTION? Hi, I have a table SalaryInfo as below Salary | Department | Level 50 | RD| Director 3 | Maintenance| Groundsman ... I want to know what level in each department makes the highest salary and how much that salary is? Something like: SELECT Salary, Level, Department FROM SalaryInfo WHERE Salary=Max(Salary) Would using MySQL 4.1 that has support for nested select help my case? Thanks in advance prashant -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED] -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]
Re: subselect question... shouldn't this work?
Ben Margolin [EMAIL PROTECTED] wrote: I am new to subselects, and what I really want is to do them in an update, but the following shows a simpler select, that also doesn't seem to work as I think it should. Advice? Do I just misunderstand how subselects are actually executed? (This is on mysql version 4.1.0-alpha-max-nt.) First, here's the tables in question: mysql describe m; +---+-+---+--+-+-+---+ | Field | Type| Collation | Null | Key | Default | Extra | +---+-+---+--+-+-+---+ | toid | int(11) | binary| YES | | NULL| | | rd| int(11) | binary| YES | | NULL| | +---+-+---+--+-+-+---+ mysql describe p; +-+-+---+--+-+-+---+ | Field | Type| Collation | Null | Key | Default | Extra | +-+-+---+--+-+-+---+ | userid | int(11) | binary| | PRI | 0 | | | pmnew | int(11) | binary| YES | | NULL| | | pmtotal | int(11) | binary| YES | | NULL| | +-+-+---+--+-+-+---+ and the data in the tables... mysql select * from p; ++---+-+ | userid | pmnew | pmtotal | ++---+-+ | 1 | 0 | 0 | | 2 | 0 | 0 | ++---+-+ 2 rows in set (0.00 sec) mysql select * from m; +--+---+ | toid | rd| +--+---+ |1 | 0 | |1 | 0 | |1 | 0 | |1 |12 | |1 |15 | |1 | 123 | |1 | 12312 | |1 | 12312 | |1 | 123 | |2 | 0 | |2 | 0 | |2 | 1 | |2 | 2 | +--+---+ 13 rows in set (0.00 sec) mysql select userid,pmtotal,pmnew, (select count(rd) from m where toid=p.userid) calc_total, (select count(rd) from m where rd=0 and toid=p.userid) calc_new from p where userid in (select distinct toid from m); ++-+---++--+ | userid | pmtotal | pmnew | calc_total | calc_new | ++-+---++--+ | 1 | 0 | 0 | 9 |3 | | 2 | 0 | 0 | NULL | NULL | ++-+---++--+ Now, the first row has what I want and expect, in calc_total and calc_new... but the second row doesn't. Why? Shouldn't the subselects in the field selector part (not the where part) be re-executed for each value in the IN()? If so, I'd expect calc_total to be '4', and calc_new to be '2' for the second row. For example, if I manually fudge the WHERE ... IN, I get: mysql select userid,pmtotal,pmnew, (select count(rd) from m where toid=p.userid) calc_total, (select count(rd) from m where rd=0 and toid=p.userid) calc_new from p where userid in (2); ++-+---++--+ | userid | pmtotal | pmnew | calc_total | calc_new | ++-+---++--+ | 2 | 0 | 0 | 4 |2 | ++-+---++--+ which is exactly what I want, but all at once :-) Ideas? Misunderstanding on my part? Bug? (By the way, what I eventually want to do is an update to set pmtotal and pmnew to be the calc_total and calc_new; in the real schema this is a simplified version of, they are essentially 'caches' of the new/total counts...) Thanks for the report. I added your report to the MySQL bug database: http://bugs.mysql.com/bug.php?id=860 -- For technical support contracts, goto https://order.mysql.com/?ref=ensita This email is sponsored by Ensita.net http://www.ensita.net/ __ ___ ___ __ / |/ /_ __/ __/ __ \/ /Victoria Reznichenko / /|_/ / // /\ \/ /_/ / /__ [EMAIL PROTECTED] /_/ /_/\_, /___/\___\_\___/ MySQL AB / Ensita.net ___/ www.mysql.com -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]
subselect question... shouldn't this work?
I am new to subselects, and what I really want is to do them in an update, but the following shows a simpler select, that also doesn't seem to work as I think it should. Advice? Do I just misunderstand how subselects are actually executed? (This is on mysql version 4.1.0-alpha-max-nt.) First, here's the tables in question: mysql describe m; +---+-+---+--+-+-+---+ | Field | Type| Collation | Null | Key | Default | Extra | +---+-+---+--+-+-+---+ | toid | int(11) | binary| YES | | NULL| | | rd| int(11) | binary| YES | | NULL| | +---+-+---+--+-+-+---+ mysql describe p; +-+-+---+--+-+-+---+ | Field | Type| Collation | Null | Key | Default | Extra | +-+-+---+--+-+-+---+ | userid | int(11) | binary| | PRI | 0 | | | pmnew | int(11) | binary| YES | | NULL| | | pmtotal | int(11) | binary| YES | | NULL| | +-+-+---+--+-+-+---+ and the data in the tables... mysql select * from p; ++---+-+ | userid | pmnew | pmtotal | ++---+-+ | 1 | 0 | 0 | | 2 | 0 | 0 | ++---+-+ 2 rows in set (0.00 sec) mysql select * from m; +--+---+ | toid | rd| +--+---+ |1 | 0 | |1 | 0 | |1 | 0 | |1 |12 | |1 |15 | |1 | 123 | |1 | 12312 | |1 | 12312 | |1 | 123 | |2 | 0 | |2 | 0 | |2 | 1 | |2 | 2 | +--+---+ 13 rows in set (0.00 sec) mysql select userid,pmtotal,pmnew, (select count(rd) from m where toid=p.userid) calc_total, (select count(rd) from m where rd=0 and toid=p.userid) calc_new from p where userid in (select distinct toid from m); ++-+---++--+ | userid | pmtotal | pmnew | calc_total | calc_new | ++-+---++--+ | 1 | 0 | 0 | 9 |3 | | 2 | 0 | 0 | NULL | NULL | ++-+---++--+ Now, the first row has what I want and expect, in calc_total and calc_new... but the second row doesn't. Why? Shouldn't the subselects in the field selector part (not the where part) be re-executed for each value in the IN()? If so, I'd expect calc_total to be '4', and calc_new to be '2' for the second row. For example, if I manually fudge the WHERE ... IN, I get: mysql select userid,pmtotal,pmnew, (select count(rd) from m where toid=p.userid) calc_total, (select count(rd) from m where rd=0 and toid=p.userid) calc_new from p where userid in (2); ++-+---++--+ | userid | pmtotal | pmnew | calc_total | calc_new | ++-+---++--+ | 2 | 0 | 0 | 4 |2 | ++-+---++--+ which is exactly what I want, but all at once :-) Ideas? Misunderstanding on my part? Bug? (By the way, what I eventually want to do is an update to set pmtotal and pmnew to be the calc_total and calc_new; in the real schema this is a simplified version of, they are essentially 'caches' of the new/total counts...) Any comments appreciated. Ben Margolin = [ Ben Margolin -- [EMAIL PROTECTED] -- [EMAIL PROTECTED] ] __ Do you Yahoo!? SBC Yahoo! DSL - Now only $29.95 per month! http://sbc.yahoo.com -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]
RE: subselect question... shouldn't this work?
These are not real subselects. You speak of a subselect when you are define a select in the FROM clause of a kwiri. If you define them in the WHERE clause, you speak of derived tables. Putting them even into the SELECT clause is something specific to MySQL (as far as I know). Ok, now this is theory and does not help you much :) Thus you can solve this without subselects: SELECT userid, pmtotal, pmnew, count(*) calc_total, sum(if(rd=0,1,0) calc_new FROM m, p WHERE userid = toid GROUP BY userid OR ( if you insist on derived tables and subselects ) SELECT userid, pmtotal, pmnew, m2.calc_total calc_total, m1.calc_new calc_new FROM m, p, ( SELECT toid, count(*) calc_new FROM m WHERE rd = 0 GROUP BY toid ) m1, ( SELECT toid, count(*) calc_total FROM m GROUP BY toid ) m2 WHERE userid IN ( SELECT distinct toid FROM m ) AND p.userid = m2.toid AND p.userid = m1.toid But I would use the first one... /rudy -Original Message- From: Ben Margolin [mailto:[EMAIL PROTECTED] Sent: woensdag 16 juli 2003 1:36 To: [EMAIL PROTECTED] Subject: subselect question... shouldn't this work? I am new to subselects, and what I really want is to do them in an update, but the following shows a simpler select, that also doesn't seem to work as I think it should. Advice? Do I just misunderstand how subselects are actually executed? (This is on mysql version 4.1.0-alpha-max-nt.) First, here's the tables in question: mysql describe m; +---+-+---+--+-+-+---+ | Field | Type| Collation | Null | Key | Default | Extra | +---+-+---+--+-+-+---+ | toid | int(11) | binary| YES | | NULL| | | rd| int(11) | binary| YES | | NULL| | +---+-+---+--+-+-+---+ mysql describe p; +-+-+---+--+-+-+---+ | Field | Type| Collation | Null | Key | Default | Extra | +-+-+---+--+-+-+---+ | userid | int(11) | binary| | PRI | 0 | | | pmnew | int(11) | binary| YES | | NULL| | | pmtotal | int(11) | binary| YES | | NULL| | +-+-+---+--+-+-+---+ and the data in the tables... mysql select * from p; ++---+-+ | userid | pmnew | pmtotal | ++---+-+ | 1 | 0 | 0 | | 2 | 0 | 0 | ++---+-+ 2 rows in set (0.00 sec) mysql select * from m; +--+---+ | toid | rd| +--+---+ |1 | 0 | |1 | 0 | |1 | 0 | |1 |12 | |1 |15 | |1 | 123 | |1 | 12312 | |1 | 12312 | |1 | 123 | |2 | 0 | |2 | 0 | |2 | 1 | |2 | 2 | +--+---+ 13 rows in set (0.00 sec) mysql select userid,pmtotal,pmnew, (select count(rd) from m where toid=p.userid) calc_total, (select count(rd) from m where rd=0 and toid=p.userid) calc_new from p where userid in (select distinct toid from m); ++-+---++--+ | userid | pmtotal | pmnew | calc_total | calc_new | ++-+---++--+ | 1 | 0 | 0 | 9 |3 | | 2 | 0 | 0 | NULL | NULL | ++-+---++--+ Now, the first row has what I want and expect, in calc_total and calc_new... but the second row doesn't. Why? Shouldn't the subselects in the field selector part (not the where part) be re-executed for each value in the IN()? If so, I'd expect calc_total to be '4', and calc_new to be '2' for the second row. For example, if I manually fudge the WHERE ... IN, I get: mysql select userid,pmtotal,pmnew, (select count(rd) from m where toid=p.userid) calc_total, (select count(rd) from m where rd=0 and toid=p.userid) calc_new from p where userid in (2); ++-+---++--+ | userid | pmtotal | pmnew | calc_total | calc_new | ++-+---++--+ | 2 | 0 | 0 | 4 |2 | ++-+---++--+ which is exactly what I want, but all at once :-) Ideas? Misunderstanding on my part? Bug? (By the way, what I eventually want to do is an update to set pmtotal and pmnew to be the calc_total and calc_new; in the real schema this is a simplified version of, they are essentially 'caches' of the new/total counts...) Any comments appreciated. Ben Margolin = [ Ben Margolin -- [EMAIL PROTECTED] -- [EMAIL PROTECTED] ] __ Do you Yahoo!? SBC Yahoo! DSL - Now only $29.95 per month! http://sbc.yahoo.com -- MySQL General Mailing List For list archives: http