2017-03-03 1 views
0
CREATE TABLE Person (#Superclass 
PPS varchar(9) NOT NULL PRIMARY KEY, 
fName varchar(20) NOT NULL, 
lName varchar(20) NOT NULL, 
DOB date NOT NULL, 
gender enum('M','F') NOT NULL DEFAULT 'M', 
email varchar(25) NOT NULL, 
contactNo varchar(10) NOT NULL, 
city varchar(10) NOT NULL, 
street varchar(20) NOT NULL 
); 

CREATE TABLE Donor (#Subclass 
PPS varchar(9) NOT NULL PRIMARY KEY REFERENCES Person(PPS), 
timesOfDonations int(1) NOT NULL DEFAULT '0' 
); 

CREATE TABLE Doctor(#Subclass 
PPS varchar(9) NOT NULL PRIMARY KEY REFERENCES Person(PPS), 
speciality varchar(20) NOT NULL, 
workHours int(3) 
); 

CREATE TABLE Health_Check (
hId int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
bloodPressure varchar(7) NOT NULL, 
weight float(4,1) NOT NULL, 
height float(4,1) NOT NULL, 
heartRate int(3) NOT NULL, 
temprature float(3,1) NOT NULL, 
alcoholicTest enum('P','F') NOT NULL DEFAULT 'P', 
dateOfCheck date, 
doctorId varchar(9), 
donorId varchar(9) 
); 

ALTER TABLE Health_Check 
    ADD CONSTRAINT donorH_fk FOREIGN KEY (donorId) REFERENCES Donor (PPS) ON DELETE RESTRICT ON UPDATE CASCADE, 
    ADD CONSTRAINT doctor_fk FOREIGN KEY (doctorId) REFERENCES Doctor (PPS) ON DELETE RESTRICT ON UPDATE CASCADE; 

#List the doctors and the names of the donors they examined during the last week. 
CREATE VIEW DoctorsAndDonors AS 
SELECT * FROM (SELECT concat(fname, ' ', lName) AS'Doctor Name' FROM Person JOIN Doctor on Person.PPS=Doctor.PPS 
    JOIN Health_Check on Doctor.PPS = Health_Check.doctorId WHERE DATEDIFF(CURDATE(), dateOfCheck) BETWEEN 1 AND 7 
       UNION ALL 
    SELECT concat(fname, ' ', lName) AS'Donor Name' FROM Person JOIN Donor on Person.PPS=Donor.PPS 
     JOIN Health_Check on Donor.PPS = Health_Check.donorId WHERE DATEDIFF(CURDATE(), dateOfCheck) BETWEEN 1 AND 7) AS a; 

은 위의보기는 올바른 결과를 반환하지만, 의사와 기증자의 이름은 레이블 "의사 이름"에서 하나 개의 컬럼에 있습니다. 내 질문 : 두 개의 열을 하나씩 만들 수있는 방법이 있나요? 하나는 의사의 이름을 표시하고 두 번째는 기증자의 이름을 보여줍니다.은 - MySQL의

감사합니다.

답변

1

관계를 결정하기 위해 Health_Check 테이블을 사용하여 기증자에 대한 의사 레코드의 PERSON 레코드에서 가져 오기 위해 모든 테이블을 함께 참여시켜야합니다. 아마도 다음과 같을 것입니다 :

SELECT 
    CONCAT (DoctorPerson.fname,' ',DoctorPerson.lName) AS 'Doctor Name', 
    CONCAT (DonorPerson.fname,' ',DonorPerson.lName) AS 'Donor Name' 
FROM Person as DoctorPerson 
    INNER JOIN Doctor ON DoctorPerson.PPS = Doctor.PPS 
    INNER JOIN Health_Check ON Doctor.PPS = Health_Check.doctorId 
    INNER JOIN Donor ON health_check.donorid = donor.PPS 
    INNER JOIN Person as DonorPerson ON Donor.PPS = DonorPerson.PPS 
WHERE DATEDIFF(CURDATE(), dateOfCheck) BETWEEN 1 AND 7