I have a set of three tables:
Dining_Tables; +--------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+-------+ | dining_table | int(11) | NO | PRI | NULL | | | bus_boy | varchar(35) | NO | | NULL | | | waiter | varchar(35) | NO | | NULL | | | server | varchar(35) | NO | | NULL | | +--------------------+--------------+------+-----+---------+-------+ Poker_Tables; +--------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+-------+ | poker_table | int(11) | NO | PRI | NULL | | | dealer | varchar(35) | NO | | NULL | | | pit_boss | varchar(35) | NO | | NULL | | +--------------------+--------------+------+-----+---------+-------+ Computer_Tables; +--------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+-------+ | computer_table | int(11) | NO | PRI | NULL | | | programmer | varchar(35) | NO | | NULL | | +--------------------+--------------+------+-----+---------+-------+
Each of these rows has globally unique table id associated with it: (dining_table, poker_table, computer_table) The other columns store the First/Last name of the person fulfilling the roll.
In my model, a single individual can be doing multiple things. For example, Joe Smith could be simultanously sitting at a computer_table as a programmer, sitting at a poker_table as a dealer, and waiting on a dining_table as a waiter.
My question is this: I want a query that will allow me to retrieve all the table_ids for a given person. Specifically, the query would then return a list of table_ids that Joe Smith is currently at.
I could do something along these lines:
select dining_table from Dining_Tables where bus_boy = 'Joe Smith' or waiter = 'Joe Smith' or server = 'Joe Smith'; select poker_table from Poker_Tables where dealer = 'Joe Smith' or pit_boss = 'Joe Smith'; select computer_table from Computer_Tables where programmer = 'Joe Smith';
However, that’s three seperate queries and I’d really prefer to avoid doing that if possible. Can I do it in one query using joins?
If you want to return it in a single query you could use a UNION statement that would join those three queries into one.
Although it is three statements, it would be returned as a single result set.
If you separated your ‘jobs’ into a separate table, it would make querying a lot easier.
I could imagine something along the lines of:
Tables, TableTypes, Persons, Roles, TableRoles
This would make all of your querying very simple and straightforward and also makes it scalable (so you can add more roles to each table without mucking your database)