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://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]

Reply via email to