2010-08-06 61 views
1

你能告诉我,如果这样做是正确的,或者如果我需要改进其中的一些,我很难理解查询的时候有一个关联实体。ERD和SQL查询帮助?

ERD http://img706.imageshack.us/img706/3796/newbitmapimageun.jpg

列出所有捐助者

SELECT* from Donor; 

列出所有捐助者

SELECT dfname, dlname 
FROM donor 

列表的第一个和最后一个名字的捐赠数量106的电话号码和125

SELECT dphone 
FROM DONOR 
WHERE dphone = “106” 
AND dphone = “125”; 

列出每个捐助方每年给

SELECT year 
FROM YEAR IN (
SELECT donor, amount 
FROM GIFT); 

名单谁取得了每年捐赠

SELECT dfname, dlname 
FROM DONOR 
WHERE IN(SELECT * FROM 
YEAR) 
AND amount != null; 

名单捐助者谁住在佐治亚州和北卡罗莱纳州

名捐助者的数量
SELECT dfname, dlname 
FROM donor 
WHERE state = “GA” 
OR state = “NC”; 

列出姓氏是威廉姆斯和住在雅典的捐助者的名字,GA

SELECT dfname, dlname 
FROM donor 
WHERE dlname = “Williams” 
AND city = “Athens” 
AND state = “GA”; 

我想感谢每一位帮助过我的人,我希望我可以给每个人一个绿色的复选标记,因为所有输入的答案都提供了一个解决方案。我很感激帮助,也许有一天我可以为您未来的问题做出贡献。

+0

在第三个,'AND'应该是'OR'。另外,WHERE子句中的那两个比较应该与主键而不是dphone相对。 – David 2010-08-06 16:21:40

+0

谢谢大家的帮助,我真的很感激。 – 2010-08-09 23:14:00

回答

2

捐助者

SELECT dfname, dlname 
FROM DONOR 
WHERE NOT EXISTS 
    (SELECT * FROM YEAR WHERE NOT EXISTS 
     (SELECT * FROM GIFT WHERE year = YEAR.year AND donor = DONOR.donor)); 

(假设礼品一行意味着捐赠制成,即量> 0总是)

+0

经过测试并在MySQL 5.1上工作。想法如下: 如果捐赠者每年捐款,那么捐赠者没有捐献的年份不存在。因此这两个NOT EXISTS子查询。 – mwittrock 2010-08-06 20:01:59

+0

谢谢你的解释 – 2010-08-09 23:16:55

1

修正查询:

列表的捐助者数量106的电话号码和125

SELECT dphone 
FROM DONOR 
WHERE donor in (106, 125) 

名单由各捐助国每年给予

SELECT donor, year, sum(amount) as amount 
FROM gift 
group by donor, year 

列出捐赠的金额谁每年都会捐款

这应该澄清:什么是“每年”的意思?

1

名单谁作出了捐赠每年

Select dfname, dlastName 
    from 
    Donor d 
    INNER JOIN 
    (SELECT Donor, count(year) cyear 
    FROM DONOR d 
    INNER JOIN gift g 
    on d.donor = g.donor 
    GROUP BY donor 
) donorYear 
    ON d.donor = donorYear.donor 
    INNER JOIN 
    (SELECT count(year) cyear 
    from Year) years 
    on years.cyear = donarYear.cyear 
2

在您的ERD捐助者你可能想要把你的礼物表的主键。如果每个捐赠者每年只有一份礼物,那么主要关键字可以是捐赠者和年份。否则,添加人工密钥将是一个好主意。

列出捐助者号码106和125的电话号码 - 我想你想在WHERE子句中使用不同的字段。你应该找到这些捐助者的电话号码(dphone),但捐助者ID不是电话号码。

列出每年捐款的捐助者 - 我认为您的查询不会按照您的要求进行。解决这个问题的一个办法是制作一份捐助者名单和他们提供的年份,然后找出他们未提供的年份。在“他们没有提供的年份”名单中没有任何参赛作品的捐赠者将是每年捐赠的名单。提示:涉及使用外部连接。

分享和享受。谁取得了每年捐款(:未测试的警告):

+0

非常感谢你 – 2010-08-09 23:15:51