2017-04-13 52 views
0

我必须在我的数据库中为远足组织进行查询: - >有多少年龄超过70岁的远足者参加了远足,名为“Pohod na Triglav”由“PlaninskodruštvoPlaninec”组织?MySQL查询帮助远足组织

的关系方案如下:

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 
    ); 

到目前为止,我得到了这一点,但它会显示他们的2,但只有一个应该在那里..:

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')); 

对不起大家..我上传的查询是在我的语言..我翻译它为更好地了解现在..因为我做了创建

+1

乍一看,我说你会想首先使用正确的连接。这可能会解决您的问题(然后您可以安全地删除DISTINCT语句)。 – Sturgus

+0

Sturgus,我在想同样的事情,但我看到很少的参照完整性。 – tadamhicks

+0

使用INNER JOIN并在查询中提及正确的表和列名 –

回答

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'); 
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...)