我有三个表:
CREATE TABLE Volunteers (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
phoneNumber varchar(100) NOT NULL,
PRIMARY KEY (id),
)
CREATE TABLE Lists (
id int(11) NOT NULL AUTO_INCREMENT,
listName varchar(50) NOT NULL,
PRIMARY KEY (id)
)
CREATE TABLE VolunteerLists(
list int(11) NOT NULL,
volunteer int(11) NOT NULL,
PRIMARY KEY (list,volunteer),
FOREIGN KEY (list) REFERENCES Lists(id),
FOREIGN KEY (volunteer) REFERENCES Volunteers(id),
)
然后,我在志愿者表:
1, David, 555-5555555
2, Joe, 444-4444444
在清单表:
1, visitors
2, deliveries
3, cleaning
在VolunteerLists表:
1,1
1,2
2,1
2,3
我怎样才能让我的格式如下数据:
VolunteerID VolunteerName visitors deliveries cleaning
1 David TRUE TRUE FALSE
2 Joe TRUE FALSE TRUE
我知道我可以使用LEFT JOIN得到这个,如果我知道的名单ID,但名单是动态的,我不想硬编码此。我可以查询数据库来获取列表,然后建系基于PHP的查询,但有一个更有效的方式来做到这一点?
这只是看起来像一个基本的支点查询对我说:
SELECT
v.id AS VolunteerID,
v.name AS VolunteerName,
CASE WHEN COUNT(l.listName = 'visitors') > 0
THEN 'TRUE' ELSE 'FALSE' END AS visitors,
CASE WHEN COUNT(l.listName = 'deliveries') > 0
THEN 'TRUE' ELSE 'FALSE' END AS deliveries,
CASE WHEN COUNT(l.listName = 'cleaning') > 0
THEN 'TRUE' ELSE 'FALSE' END AS cleaning
FROM Volunteers v
INNER JOIN VolunteerLists vl
ON v.id = vl.volunteer
INNER JOIN Lists l
ON vl.list = l.id
GROUP BY
v.id,
v.name;