>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

Reply via email to