>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. -- /* All outgoing email scanned by Norton Antivirus 2002 */ Amer Neely, Softouch Information Services W: www.softouch.on.ca E: [EMAIL PROTECTED] V: 519.438.5887 Perl | PHP | MySQL | CGI programming for all data entry forms. "We make web sites work!" --------------------------------------------------------------------- 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