查询表架构难度

时间:2014-10-05 05:12:17

标签: mysql sql database architecture

我正在使用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,但是想要显示从人员表中借出的个人的全名。我是否需要重新设计lend表如何连接到people表,或者只是在查询中使用某种case函数?以下是我的查询到目前为止我获得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

;

2 个答案:

答案 0 :(得分: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

如果您正在寻找,可以添加其他开关逻辑来优化结果。

答案 1 :(得分:0)

我已经通过重新设计数据架构解决了这个问题。看看是否有兴趣。

http://sqlfiddle.com/#!2/b6158/3