组织的MySQL查询帮助
我必须在数据库中查询徒步旅行组织: ->有多少70岁以上的徒步旅行者参加了这次由Planinsko društvo Planinec组织组织的名为Pohod na Triglav的徒步旅行 相关方案如下所示:组织的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
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,我也在想同样的事情,但我发现很少有引用完整性。请使用内部联接,并在查询中提及正确的表和列名