MySQL Query帮助远足组织

时间:2017-04-13 20:20:40

标签: mysql

我必须在我的数据库中为远足组织进行查询: - >有多少年龄超过70岁的徒步旅行者加入了名为“Pohod na Triglav”的徒步旅行,这是由“PlaninskoruvštvoPlaninec”组织组织的?

关系方案如下:

    CREATE TABLE Hikers(
    IDHiker INTEGER NOT NULL,
    Name VARCHAR(45) NOT NULL,
    LastName VARCHAR(45) NOT NULL,
    Sex ENUM('male', 'female'),
    BirthDay DATE NOT NULL,
    Phone VARCHAR(45)
    );

//table for joining hikers and hikes (includes foreign keys)
    CREATE TABLE Hiker_has_joined_the_Hike(
    IDJoin INTEGER NOT NULL,
    Hikers_IDHiker INTEGER NOT NULL,
    Hikes_IDHike INTEGER NOT NULL
    );

    CREATE TABLE Hikes(
    IDHike INTEGER NOT NULL,
    Type_of_hike_IDType_of_hike INTEGER NOT NULL,
    Name_Hike VARCHAR(45) NOT NULL,
    No_of_available_hikers INTEGER NOT NULL,
    Time_of_beginning DATETIME NOT NULL,
    Time_of_end DATETIME NOT NULL
    );

//table for joining organizations and hikes (includes foreign keys)
    CREATE TABLE Organization_organizes_a_Hike(
    IDOrganization INTEGER NOT NULL,
    Organizations_IDOrganization INTEGER NOT NULL,
    Hikes_IDHike INTEGER NOT NULL
    );

    CREATE TABLE Organizations(
    IDOrganization INTEGER NOT NULL,
    Title VARCHAR(45) NOT NULL,
    Short_title VARCHAR(45),
    E_mail VARCHAR(45) NOT NULL,
    Phone VARCHAR(45) NOT NULL
    );

到目前为止,我得到了这个,但它显示了其中的两个,但只有一个应该在那里..:

SELECT DISTINCT COUNT(Hikers.IDHiker) AS No_of_joined_above_70
FROM Hikers, Hiker_has_joined_the_Hike, Hikes, Organization_organizes_a_Hike, Organizations
WHERE ((Hikers.IDHiker = Hiker_has_joined_the_Hike.Hikers_IDHiker) && (Hiker_has_joined_the_Hike.Hikes_IDHike = Hikes_IDHike) && (Hikes_IDHike = Organization_organizes_a_Hike.Hikes_IDHike) && (Organization_organizes_a_Hike.Organizations_IDOrganization = Organizations_IDOrganization) && ((YEAR(CURDATE()) - YEAR(Hikers.BirthDay))>70) && (Hikes.Name_Hike='Pohod na Triglav') && (Organizations.Title='Planinsko društvo Planinec'));

对不起大家..我上传的查询是用我的语言...我翻译了它以便更好地理解现在......我用创作

2 个答案:

答案 0 :(得分:1)

我认为问题在于,独特应该在计数内。 使用显式连接,它看起来像:

SELECT COUNT(DISTINCT Planinci.IDPlaninca) AS Stevilo_Udelezenih_Planincev_Nad_70
FROM Planinci
    inner join planinec_se_je_udelezil_izleta 
        on Planinci.IDPlaninca = planinec_se_je_udelezil_izleta.Planinci_IDPlaninca
    inner join Izleti on planinec_se_je_udelezil_izleta.Izleti_IDIzleta = Izleti.IDIzleta
    inner join drustvo_organizira_izlet on Izleti.IDIzleta = drustvo_organizira_izlet.Izleti_IDIzleta
    inner join Drustva on drustvo_organizira_izlet.Drustva_IDDrustva = Drustva.IDDrustva
WHERE ((YEAR(CURDATE()) - YEAR(Planinci.Rojstni_Datum))>70) 
      && (Izleti.Naziv='Pohod na Triglav') 
      && (Drustva.Naziv='Planinsko društvo Planinec');

答案 1 :(得分:0)

是的,MySQL在您的COUNT聚合函数中支持DISTINCT。对于仅符合您标准的徒步旅行者人数的输出,您的陈述:

SELECT DISTINCT COUNT(Planinci.IDPlaninca) AS Stevilo_Udelezenih_Planincev_Nad_70
FROM Planinci, planinec_se_je_udelezil_izleta, Izleti, drustvo_organizira_izlet, Drustva
WHERE ((Planinci.IDPlaninca = planinec_se_je_udelezil_izleta.Planinci_IDPlaninca) && (planinec_se_je_udelezil_izleta.Izleti_IDIzleta = Izleti.IDIzleta) && (Izleti.IDIzleta = drustvo_organizira_izlet.Izleti_IDIzleta) && (drustvo_organizira_izlet.Drustva_IDDrustva = Drustva.IDDrustva) && ((YEAR(CURDATE()) - YEAR(Planinci.Rojstni_Datum))>70) && (Izleti.Naziv='Pohod na Triglav') && (Drustva.Naziv='Planinsko društvo Planinec'));

会变成类似的东西:

SELECT COUNT(DISTINCT Hikers.HikerID) AS PohodHikersCount
FROM Hikers 
INNER JOIN HikersOnHikes ON Hikers.HikerID = HikersOnHikes.HikerID
INNER JOIN Hikes ON HikersOnHikes.HikeID = Hikes.HikeID
INNER JOIN Organizations ON Hikes.OrganizationID = Organizations.OrganizationID
WHERE Organizations.OrganizationName = 'Planinsko društvo Planinec'
    AND Hikers.HikerName = 'Pohod na Triglav'
    AND Hikers.HikerAge > 70;
-- (or " AND YEAR(CURDATE()) - YEAR(Hikers.BirthDay))>70;" if that's how your ages work...)