我正试图让所有在尼泊尔进行 all 徒步旅行的徒步旅行者。 我在数据库中的表是:
远足者:(hikerID,全名)。
HikerInTrek:(hikerID,trekName)。
NepalTreks:(trekName)。
我尝试了以下代码:
SELECT fullName
FROM Hiker
WHERE hikerID = (
SELECT hikerID
FROM hikerInTrek
WHERE hikerID not in( SELECT hikerID
FROM ( ( SELECT hikerID, trekName
FROM (SELECT hikerID
FROM hikerInTrek)
cross join
(SELECT trekName
FROM NepalTreks)
)
EXCEPT
( SELECT hikerID, trekName
FROM hikerInTrek
)
)
)
);
我正在做家庭作业的网站部分,并且已经在PHP中编写了此代码,但是在查询后出现“ if($ queryResult === false)条件的错误。所以我猜查询不正确。
答案 0 :(得分:1)
我将使用聚合:
SELECT h.hikerID, h.fullName
FROM Hiker h JOIN
HikerInTrek ht
ON h.hikerID = ht.hikerID JOIN
Nepal_Treks nt
ON nt.TrekName = ht.TrekName
GROUP BY h.hikerID, h.fullName
HAVING COUNT(DISTINCT nt.TrekName) = (SELECT COUNT(*) FROM Nepal_Treks);
请注意,这也包括hikerID
。我认为没有理由假设远足者从不使用相同的名字。
答案 1 :(得分:0)
尝试一下。
SELECT
A.fullName
FROM
Hiker A
INNER JOIN
HikerInTrek B ON B.hikerID = A.hikerID
WHERE
B.trekName = 'Nepal'
答案 2 :(得分:0)
根据您的trekName
列的设置方式以及SQL方言的不同,可能类似。.
SELECT fullName
FROM Hiker h
JOIN HikerInTrek ht on h.hikerID = ht.hikerID
JOIN Nepal_Treks nt on nt.TrekName = ht.TrekName
尽管我将表重组为如下格式(使用sql命名约定)
Hiker
- id
- full_name
HikerTrek
- id
- hiker_id
- trek_id
Trek
- id
- name
- location_id
TrekLocation
- id
- name
在“远足者”中为每个远足者创建一行
在TrekLocation中为尼泊尔创建一行,
在Trek中为每个Trek创建一行,其位置ID为尼泊尔的一个
然后您可以像这样查询它
SELECT h.full_name
FROM Hiker h
JOIN HikerTrek ht on h.id = ht.hiker_id
JOIN Trek t on ht.trek_id = t.id
JOIN TrekLocation tl on t.location_id = tl.id
WHERE tl.name = "Nepal"
希望这可以使事情变得简单