2014-10-05 67 views
0

我工作的一個實踐問題,DDL如下:表架構困難查詢

CREATE TABLE people (
    id SMALLINT NOT NULL AUTO_INCREMENT, 
    first_name VARCHAR(50), 
    last_name VARCHAR(50), 
    PRIMARY KEY (id) 
) 
; 

CREATE TABLE cd (
    id SMALLINT NOT NULL AUTO_INCREMENT, 
    artist VARCHAR(50), 
    title VARCHAR(50), 
    PRIMARY KEY(id), 
    owner SMALLINT, 
    FOREIGN KEY (owner) REFERENCES people(id) 
) 
; 

CREATE TABLE lend (
    id SMALLINT NOT NULL AUTO_INCREMENT, 
    cd_id SMALLINT, 
    lend_to SMALLINT, 
    FOREIGN KEY (lend_to) REFERENCES people(id), 
    FOREIGN KEY (cd_id) REFERENCES cd(id), 
    lend_date DATE DEFAULT '0000-00-00', 
    PRIMARY KEY(id) 
) 
; 

INSERT INTO people (id, first_name, last_name) VALUES 
(1, 'Brett', 'CEO'), 
(2, 'Jeff', 'President'), 
(3, 'Beta', 'Media'), 
(4, 'Casey', 'Content') 
; 

INSERT INTO cd (id, artist, title, owner) VALUES 
(1, 'The xx', 'Coexist', 2), 
(2, 'ACDC', 'High Voltage', 1), 
(3, 'Bjork', 'Cocoon', 3), 
(4, 'Ella Fitzgerald', 'Ella Sings Gershwin', 4), 
(5, 'Fever Ray', 'Live in Lulea', 2), 
(6, 'Tom Waits', 'Rain Dogs', 4), 
(7, 'Howlin Wolf', 'Smokestack Lightning', 1), 
(8, 'Tupac', 'Poetic Justice', 4) 

; 


INSERT INTO lend (id, cd_id, lend_to, lend_date) VALUES 
(1, 2, 3, '2014/01/03'), 
(2, 3, 1, '2014/04/02'), 
(3, 7, 4, '2013/12/22'), 
(4, 4, 2, '2014/01/03') 

; 

我希望我的查詢,以顯示誰的CD借給。我可以從借出表中獲取ID,但想要顯示從people表中借出的個人的全名。我是否需要重新設計借出表如何連接到人員表,或只是在查詢中使用某種情況下的功能?以下是我的查詢,我得到了l.lent_to並且想要顯示CD借給的CONCAT(p.first_name,'',p.last_name)。

SELECT /*cd.id,*/ 
     CONCAT(p.first_name, ' ', p.last_name) 'CD OWNER', 
     cd.title, 

    l.lend_to, 
    p.id , 

     (
     CASE 
      WHEN l.lend_to IS NULL 
      THEN 'Not Lent' 
      ELSE DATE_FORMAT(l.lend_date, '%m-%d-%Y') 
     END 
    ) 'LEND DATE', 

     (
     CASE 
      WHEN l.lend_to IS NULL 
      THEN 'Not Lent' 
      ELSE TIMESTAMPDIFF(day, l.lend_date, NOW()) 
     END 
     ) 'DAYS LENT' 


FROM 
people p 
LEFT JOIN cd cd 
ON p.id = cd.owner 

LEFT JOIN lend l 
ON cd.id = l.cd_id 

LEFT JOIN lend l1 
on p.id = l1.lend_to 

; 

回答

0

看看這個查詢爲您提供您正在尋找

select c.title as 'Title', c.artist as 'Artist', o.first_name as 'Owner', 
l.lend_date as 'Lend Date', p.first_name as 'Lender' 
from cd c 
left outer join people o on c.owner = o.id 
left outer join lend l on c.id = l.cd_id 
left outer join people p on l.lend_to = p.id 

的基本信息,您可以添加額外的開關邏輯來提高的結果,如果這是你在找什麼。

+0

謝謝你的建議,ArunGeorge。但我擔心,這並不能解決在查詢結果的同一行顯示貸方和lendee的名稱的問題。我開始將這個問題看作是一個架構缺陷。任何查詢都需要加入p.id中的人員表。該lendee永遠不能退回。現在我試圖看看如何重新設計模式以允許貸方和貸方在返回的同時仍然遵守完善的RDBMS原則並避免多個表中的數據重複,即貸方和貸方的名稱。 – gpanda 2014-10-05 15:41:26

+0

CD上的所有者是借給它的人嗎?如果是的話,上面的查詢是不是給每個CD的所有者詳細信息,以及它給予貸款的人的詳細信息?試圖找出缺少的信息是什麼。 – ArunGeorge 2014-10-06 06:52:26