帮助两个SQL查询

时间:2010-04-27 16:18:58

标签: sql mysql

我在两个查询时遇到了一些困难。我可以获得一些信息,但我的问题在于我在SQL语句中似乎无法正确处理的一些特殊情况。

第一个查询是用自然语言定义的:

我将找到所有获得两项资格但在同一期间但来自不同院校的候选人

我的Relational架构如下所示:

BOLD =主键

ITALICS =外键

candidate =( candidateid ,姓名,出生,邮件)

资格=( qualidid instituteid candidateid ,datestarted,datefinished,degreename,major)

学院=(院长,学院名,城市)

我试图运行的SQL不是很漂亮(在这一点上)并且不工作,但它是:

select (candidate.firstname, candidate.lastname) 
from candidate, qualification, institute 
where (select count(qualification.candidateid) from qualification where qualification.candidateid = 2) 
and between qualification.datestarted and qualification.datefinished
and qualification.instituteid <> qualification.instituteid

我给了我一个错误,我很漂亮,几乎可以肯定它是在COUNT子句中但我似乎无法破解它如何计算候选人的数量并将条件设置为二(2)和那么我很确定我在检查时间段时遇到问题。它们必须处于同一时期。 顺便说一下,datestarted和datefinished是DATE格式。

我遇到问题的第二个问题是使用这样的自然语言:

查找所有对候选人进行查询但平均年龄低于30岁的公司的名称(候选人)。

我的关系模式如下所示:

candidate =( candidateid ,姓名,出生,邮件)

资格=( qualidid instituteid candidateid ,datestarted,datefinished,degreename,major)

查询=( inquiryid candidateid companyid

我尝试的查询是:

select (company.companyname) as company
from company, inquiry, candidates
where company.companyid = inquiry.companyid
and inquiry.candidateid = candidate.candidateid
and (select avg(candidate.birth < (right(curdate(),5<right(birth,5)) from candidate)))

BIRTH tuble也被描述为DATE字段。

我希望你能帮助我解决这两个问题,如果对他们有任何疑问,请说出来,我会尽力澄清。

Mestika

4 个答案:

答案 0 :(得分:1)

你的其他问题是使用笛卡尔JOINS(用逗号分隔FROM子句中的表)而不是显式JOIN(INNER或LEFT或RIGHT)。您可能会发现Understanding SQL Joins读得很好。

答案 1 :(得分:0)

关于你的第一个问题:你有一些问题。一个是你必须两次加入资格,因为你想比较一个匹配的值和另一个匹配。另一个是你的日期比较没有价值可比。它应该是x between y and z - 在您的示例中。你没有x

在您加入两次后,您可以修改最后一行以说出qual1.instid <> qual2.instid

如果你想要更多细节,但我认为这可能会让你开始。顺便说一句,我发现SQL连接语法更容易处理,但对每个人来说都是如此。它有助于解决的一个问题是您似乎拥有巨大的笛卡尔联盟,因为您似乎没有任何加入标准。

答案 2 :(得分:0)

SELECT  *
FROM    candidate c
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    qualification q1
        JOIN    qualification q2
        ON      q2.candidateid = q1.candidateid
                AND q2.datestarted = q1.datestarted
                AND q2.dateended = q1.dateended
                AND q2.instituteid <> q1.instituteid
        WHERE   q2.candidateid = c.candidateid
        )

答案 3 :(得分:0)

子查询q应该获得所有候选ID的列表,这些候选ID在同一时间段内在不同的机构中至少有一个其他候选者。子查询连接到候选表以获取名称。

SELECT(c.firstname, c.lastname) 
FROM candidate c JOIN 
  (SELECT q1.candidate_id FROM qualification q1 
    JOIN qualification q2 ON (q1.institute_id!=q2.institute_id) 
    WHERE q1.datefinished BETWEEN $somestartdate AND $someenddate 
      AND q2.datefinished BETWEEN $somestartdate AND $someenddate)q
ON (c.candidateid = q.candidateid)