2017-04-13 7 views
0

私のデータベースの中でハイキング組織のクエリを作成する必要があります: - "Pohod na Triglav"という名前のハイキングに、70歳以上のハイカーが何人も参加しました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

、私はあなたがしたいと思いますと言うだろう適切なJOINSを使用して開始します。それはおそらくあなたの問題を解決するでしょう(そしてあなたは安全に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...)