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]

Reply via email to