I'm trying to construct a query and running into either a limitation of the SQL
language or (more probably) a limitation in my *comprehension* of the SQL
language.  Here's a simplified version of my data set:

=======================================================
CREATE TABLE people (
  name varchar(11) default NULL,
  parent varchar(11) default NULL,
  dob date default NULL
);

INSERT INTO people VALUES ('George W','George HW','1946-07-06');
INSERT INTO people VALUES ('George HW','Prescott','1924-06-12');
INSERT INTO people VALUES ('Prescott','Samuel P','1895-05-15');
INSERT INTO people VALUES ('Samuel P','James Smith','1863-10-04');
INSERT INTO people VALUES ('Jeb','George HW','1953-02-11');
INSERT INTO people VALUES ('Neil','George HW','1955-01-22');
INSERT INTO people VALUES ('Marvin','George HW','1956-10-22');
INSERT INTO people VALUES ('Jenna','George W','1981-11-25');
INSERT INTO people VALUES ('Barbara','George W','1981-11-25');
INSERT INTO people VALUES ('James Smith','Obadiah','1825-06-15');
=======================================================

THE PROBLEM: I want to select parents whose children are all more than 50 years
old.  (If a parent has one 55 year old and one 45 year old they don't get
selected: having children under 50 disqualifies them from selection.)

Here's the kids:

mysql> SELECT p.name as parent,c.name as
child,(TO_DAYS(NOW())-TO_DAYS(c.dob))/365 as age FROM people as p LEFT JOIN
people as c ON p.name=c.parent WHERE c.name IS NOT NULL ORDER BY p.dob;
+-----------+-----------+--------+
| parent    | child     | age    |
+-----------+-----------+--------+
| Samuel P  | Prescott  | 109.44 |
| Prescott  | George HW |  80.34 |
| George HW | George W  |  58.26 |
| George HW | Jeb       |  51.65 |
| George HW | Neil      |  49.71 |
| George HW | Marvin    |  47.96 |
| George W  | Jenna     |  22.85 |
| George W  | Barbara   |  22.85 |
+-----------+-----------+--------+
8 rows in set (0.00 sec)

Here's the youngest kids:

mysql> SELECT p.name as parent,c.name as
child,MIN((TO_DAYS(NOW())-TO_DAYS(c.dob))/365) as minage FROM people as p LEFT
JOIN people as c ON p.name=c.parent WHERE c.name IS NOT NULL GROUP BY parent
ORDER BY p.dob;
+-----------+-----------+--------+
| parent    | child     | minage |
+-----------+-----------+--------+
| Samuel P  | Prescott  | 109.44 |
| Prescott  | George HW |  80.34 |
| George HW | George W  |  47.96 |
| George W  | Jenna     |  22.85 |
+-----------+-----------+--------+
4 rows in set (0.01 sec)

And here's my attempted solution:

mysql> SELECT p.name as parent,c.name as
child,MIN((TO_DAYS(NOW())-TO_DAYS(c.dob))/365) as minage FROM people as p LEFT
JOIN people as c ON p.name=c.parent WHERE c.name IS NOT NULL AND minage > 50
GROUP BY parent ORDER BY p.dob;
ERROR 1054: Unknown column 'minage' in 'where clause'

Unfortunately it doesn't look like I can SELECT on the MIN() result: I can only
specify which rows go into the MIN().  How can I perform this select?

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to