Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组织的MySQL查询帮助_Mysql - Fatal编程技术网

组织的MySQL查询帮助

组织的MySQL查询帮助,mysql,Mysql,我必须在数据库中查询徒步旅行组织: ->有多少70岁以上的徒步旅行者参加了这次由Planinsko društvo Planinec组织组织的名为Pohod na Triglav的徒步旅行 相关方案如下所示: CREATE TABLE Hikers( IDHiker INTEGER NOT NULL, Name VARCHAR(45) NOT NULL, LastName VARCHAR(45) NOT NULL, Sex ENUM('male', 'fe

我必须在数据库中查询徒步旅行组织: ->有多少70岁以上的徒步旅行者参加了这次由Planinsko društvo Planinec组织组织的名为Pohod na Triglav的徒步旅行

相关方案如下所示:

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

对不起,各位..我上传的查询是用我的语言编写的..我现在翻译它是为了更好地理解..就像我对creates所做的那样

我认为问题是distinct应该在计数内。 使用显式联接时,它看起来像:

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

是的,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...)

乍一看,我认为您应该从使用正确的联接开始。这可能会解决您的问题,然后您也可以安全地删除DISTINCT语句。Sturgus,我也在想同样的事情,但我发现很少有引用完整性。请使用内部联接,并在查询中提及正确的表和列名