如何查询一个表中某一列的所有值,而另一表中另一列具有所有值?

时间:2019-06-23 11:28:55

标签: sql

我正试图让所有在尼泊尔进行 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)条件的错误。所以我猜查询不正确。

3 个答案:

答案 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为尼泊尔的一个

在HikerTrek中,为徒步旅行者每次骑行都创建一行,

然后您可以像这样查询它

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"

希望这可以使事情变得简单