2017-04-13 51 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...)