I have a setup which I will simplify as follows:

There is a table of courses.
Every course can have any number of people working on it.
Every course involves any number of tasks.

I want to make a SELECT which will return a table as follows:

course1         number-of-people-involved-in-course1    
number-of-tasks-involved-in-course1
course2         number-of-people-involved-in-course2    
number-of-tasks-involved-in-course2
course3         number-of-people-involved-in-course3    
number-of-tasks-involved-in-course3
course4         number-of-people-involved-in-course4    
number-of-tasks-involved-in-course4
...

I can do one or the other but not both.  Here's some text commands for you to 
play around with.

CREATE TABLE courses (id INTEGER PRIMARY KEY,name TEXT);
CREATE TABLE people (id INTEGER PRIMARY KEY,course INTEGER,name TEXT);
CREATE TABLE tasks (id INTEGER PRIMARY KEY,course INTEGER,name TEXT);
INSERT INTO courses VALUES (14,'starter course');
INSERT INTO people VALUES (21,14,'erica');
INSERT INTO people VALUES (22,14,'rod');
INSERT INTO tasks VALUES (31,14,'teaching');
INSERT INTO tasks VALUES (32,14,'marking');

sqlite> SELECT courses.name,group_concat(people.name) FROM courses LEFT JOIN 
people ON people.course=courses.id GROUP BY courses.id;
starter course|erica,rod

sqlite> SELECT courses.name,group_concat(tasks.name) FROM courses LEFT JOIN 
tasks ON tasks.course=courses.id GROUP BY courses.id;
starter course|marking,teaching

BUT ...

sqlite> SELECT courses.name,group_concat(people.name),group_concat(tasks.name) 
FROM courses LEFT JOIN people ON people.course=courses.id LEFT JOIN tasks ON 
tasks.course=courses.id GROUP BY courses.id;
starter course|erica,erica,rod,rod|marking,teaching,marking,teaching

sqlite> SELECT courses.name,group_concat(people.name),group_concat(tasks.name) 
FROM courses LEFT JOIN people ON people.course=courses.id LEFT JOIN tasks ON 
tasks.course=courses.id GROUP BY courses.id,people.id,tasks.id;
starter course|erica|teaching
starter course|erica|marking
starter course|rod|teaching
starter course|rod|marking

probably because ...

sqlite> SELECT * FROM courses LEFT JOIN people ON people.course=courses.id LEFT 
JOIN tasks ON tasks.course=courses.id;
14|starter course|21|14|erica|32|14|marking
14|starter course|21|14|erica|31|14|teaching
14|starter course|22|14|rod|32|14|marking
14|starter course|22|14|rod|31|14|teaching

sqlite> SELECT * FROM courses LEFT JOIN people ON people.course=courses.id LEFT 
JOIN tasks ON tasks.course=courses.id GROUP BY courses.id;
14|starter course|22|14|rod|31|14|teaching

Is there some way of using DISTINCT or some other tactic which will make it 
list each related entry just the once ?  Very grateful for any help.

Simon.
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to