Hi Armer, thanks a lot for your help ... it was very usefull!!! After understanding the principles I wonder why I didn't think it up myself ... but then solutions often appear obvious after a problem is solved.
Also I like your remarks on testing queries on paper first -- I'll see if I can use that ... And finally I noticed that I can find out how many invoices have been issued per job using the <count> term. Thus making it easy to keep track about monitions: mysql> select jobs.*, count(invoices.invoice_id) -> from invoices, jobs -> where jobs.job_id = invoices.job_id -> group by invoices.job_id thanks again!! -- K:) on 28/8/02 11:47 Uhr, Amer Neely at [EMAIL PROTECTED] wrote: >> Subject: job database with invoicing >> Date: Tue, 27 Aug 2002 22:05:43 +0200 >> From: Kai Vermehr <[EMAIL PROTECTED]> >> To: MySQL List <[EMAIL PROTECTED]> >> >> I'm building a job database with simple invoicing. I have one table called >> JOBS and one called INVOICES. In INVOICES there's a foreign key column >> called job_id referencing INVOICES to JOBS.job_id. >> >> in a simplified way it looks like this: >> (there are a lot of other columns of course) >> >> -------- >> >> table JOBS ( >> job_id int not null auto_increment, >> jobname char(30), >> primary key job_id >> ) >> >> and >> >> table INVOICES ( >> invoice_id int not null auto_increment, >> job_id int(11), >> foreign key job_id, >> primary key invoice_id >> ) >> >> -------- >> >> Would this make sense if in the future I want to find out: >> >> #1 which jobs have and have not been invoiced >> #2 what invoices are linked to specific job >> >> What would the MySQL statement look like? I've tried to find out but I'm not >> sure if the relations between both tables make sense at all ... >> >> thanks for any help! K:) >> > > I'm in the middle of writing my own accounts receivable db so this > caught my eye. > > My first question though concerns your first question. If a job hasn't > been invoiced, there won't / shouldn't be an entry for 'job_id' in the > INVOICES table, right? > > When I start work on a new db, I usually put some dummy data down on > paper in a grid and do all my testing there. Once I have an answer to a > query, I can then test it against the real db by comparing results. > > The dummy data I used: > mysql> select * from invoices; > +------------+--------+ > | invoice_id | job_id | > +------------+--------+ > | 701 | 1 | > | 702 | 2 | > | 703 | 1 | > | 704 | 3 | > | 705 | 1 | > | 706 | 3 | > | 707 | 2 | > | 708 | 5 | > | 709 | 1 | > | 710 | 2 | > +------------+--------+ > 10 rows in set (0.00 sec) > > mysql> select * from jobs; > +--------+----------+ > | job_id | job_name | > +--------+----------+ > | 1 | A | > | 2 | B | > | 3 | C | > | 4 | D | > | 5 | E | > +--------+----------+ > 5 rows in set (0.00 sec) > > *** Note that job_id 4 (D) does not have an entry in the invoices table, > therefore it hasn't been invoiced. > > In this case your first question can be translated into something like: > > Q: what jobs have been invoiced > mysql> select invoices.*, jobs.* from invoices,jobs > -> where jobs.job_id=invoices.job_id > -> group by invoices.job_id; > +------------+--------+--------+----------+ > | invoice_id | job_id | job_id | job_name | > +------------+--------+--------+----------+ > | 701 | 1 | 1 | A | > | 702 | 2 | 2 | B | > | 704 | 3 | 3 | C | > | 708 | 5 | 5 | E | > +------------+--------+--------+----------+ > 4 rows in set (0.00 sec) > > Q; what jobs have not been invoiced? > mysql> select jobs.*,invoices.* from jobs left join invoices on > -> jobs.job_id=invoices.job_id; > +--------+----------+------------+--------+ > | job_id | job_name | invoice_id | job_id | > +--------+----------+------------+--------+ > | 1 | A | 701 | 1 | > | 1 | A | 703 | 1 | > | 1 | A | 705 | 1 | > | 1 | A | 709 | 1 | > | 2 | B | 702 | 2 | > | 2 | B | 707 | 2 | > | 2 | B | 710 | 2 | > | 3 | C | 704 | 3 | > | 3 | C | 706 | 3 | > | 4 | D | NULL | NULL | > | 5 | E | 708 | 5 | > +--------+----------+------------+--------+ > 11 rows in set (0.11 sec) > > or, perhaps a better query ... > > mysql> select jobs.*,invoices.* > -> from jobs left join invoices on jobs.job_id=invoices.job_id > -> where invoices.job_id is null; > +--------+----------+------------+--------+ > | job_id | job_name | invoice_id | job_id | > +--------+----------+------------+--------+ > | 4 | D | NULL | NULL | > +--------+----------+------------+--------+ > 1 row in set (0.00 sec) > > > Q: what invoices are linked to specific job > mysql> select invoices.*,jobs.* from invoices,jobs > -> where job_name like '%A%' > -> and invoices.job_id=jobs.job_id > -> order by invoice_id; > +------------+--------+--------+----------+ > | invoice_id | job_id | job_id | job_name | > +------------+--------+--------+----------+ > | 701 | 1 | 1 | A | > | 703 | 1 | 1 | A | > | 705 | 1 | 1 | A | > | 709 | 1 | 1 | A | > +------------+--------+--------+----------+ > 4 rows in set (0.05 sec) > > That should get you on your way. -- Kai Vermehr eBoy Graphics http://www.eboy.com --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php