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]