Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Minimizing SQL queries using join with one-to-many relationship

Tags:

sql

mysql

So let me preface this by saying that I'm not an SQL wizard by any means. What I want to do is simple as a concept, but has presented me with a small challenge when trying to minimize the amount of database queries I'm performing.

Let's say I have a table of departments. Within each department is a list of employees.

What is the most efficient way of listing all the departments and which employees are in each department.

So for example if I have a department table with:

id   name
1    sales
2    marketing

And a people table with:

id   department_id   name
1    1               Tom
2    1               Bill
3    2               Jessica
4    1               Rachel
5    2               John

What is the best way list all departments and all employees for each department like so:

Sales

  • Tom
  • Bill
  • Rachel

Marketing

  • Jessica
  • John

Pretend both tables are actually massive. (I want to avoid getting a list of departments, and then looping through the result and doing an individual query for each department). Think similarly of selecting the statuses/comments in a Facebook-like system, when statuses and comments are stored in separate tables.

like image 558
Brian Avatar asked Mar 15 '10 22:03

Brian


People also ask

How do you join a table with one-to-many relationships?

The table on the "one" side of the "one-to-many" relationship should have a primary key column. The other table should have a foreign-key defined pointing to the primary key on the first table. To return results from both tables you'd add an INNER JOIN clause to join both tables.

How do I reduce the number of joins in SQL?

For temporary table just add "#" before table name and insert desired data from joins and later use it but in same session.

How do you query a one to many relationship in SQL?

One to Many Relationship (1:M) This is where a row from one table can have multiple matching rows in another table this relationship is defined as a one to many relationship. This type of relationship can be created using Primary key-Foreign key relationship.


1 Answers

You can get it all in a single query with a simple join, e.g.:

SELECT   d.name AS 'department', p.name AS 'name'
FROM     department d
  LEFT JOIN people p ON p.department_id = d.id
ORDER BY department

This returns all the data, but it's a bit of a pain to consume, since you'll have to iterate through every person anyway. You can go further and group them together:

SELECT   d.name AS 'department',
         GROUP_CONCAT(p.name SEPARATOR ', ') AS 'name'
FROM     department d
  LEFT JOIN people p ON p.department_id = d.id
GROUP BY department

You'll get something like this as the output:

department | name
-----------|----------------
sales      | Tom, Bill, Rachel
marketing  | Jessica, John
like image 139
Max Shawabkeh Avatar answered Nov 01 '22 01:11

Max Shawabkeh