SQL,如何获取具有两个值的所有行...使用连接?

时间:2014-06-10 19:18:37

标签: sql oracle

我正在使用PHP,Oracle 11g数据库。我有这些数据库表(除其他外,但这些数据):

CREATE TABLE przystanki (
nazwa VARCHAR(32),
id_przyst INT PRIMARY KEY NOT NULL
);

CREATE TABLE trasa (
id_trasa INT PRIMARY KEY NOT NULL
);

CREATE TABLE polaczenie (
id_przyst INT REFERENCES przystanki(id_przyst),
id_trasa INT REFERENCES trasa (id_trasa)
);

CREATE TABLE kurs (
odjazd INT,
przyjazd INT,
info CHAR(8) DEFAULT '00000000' NOT NULL,
id_przew INT REFERENCES przewoznik(id_przew),
id_trasa INT REFERENCES trasa(id_trasa),
id_cena INT REFERENCES cennik(id_cena),
id_kurs INT PRIMARY KEY NOT NULL
);

现在,我想获取kurstrasa的所有行,其中przystanki有两个SELECT DISTINCT odjazd, przyjazd, info, id_przew, id_cena, id_kurs, id_trasa, id_przyst, nazwa FROM kurs INNER JOIN polaczenie USING (id_trasa) INNER JOIN trasa USING (id_trasa) INNER JOIN przystanki USING (id_przyst) WHERE nazwa='{$a}' OR nazwa='{$b}'; 用户指定。

我尝试过类似的东西:

{{1}}

但是它给了我所有那些既有$ a又有$ b的行,那些有$ a而不是$ b的行,以及那些有$ b而不是$ a的行。

我想只获得同时拥有$ a和$ b的那些。

我尝试了一些有交叉的东西,但它根本不起作用。

为了更好地理解用户想要从公共汽车站(przystanki)$ a到公共汽车站$ b并且系统应检查哪些路线(trasa)同时具有$ a和$ b,然后在所有可用时间列出所有游乐设施等(kurs)。

任何帮助?

2 个答案:

答案 0 :(得分:1)

如果您同时想要$ a和$ b,则应使用WHERE nazwa='{$a}' AND nazwa='{$b}'。如果您仍然遇到任何问题,请尝试告诉我。

答案 1 :(得分:0)

这是您在使用polaczenie表时遇到的多对多连接。你要么必须使用EXISTS,要么需要两个JOIN来使用polaczenie。我添加了一个SQLFiddle示例。代码在那里运行。如果您向模式添加一些数据,我们可以更多地测试它。

有两个连接的示例:

SELECT DISTINCT
  kurs.odjazd,
  kurs.przyjazd,
  kurs.info,
  kurs.id_przew,
  kurs.id_cena,
  kurs.id_kurs,
  kurs.id_trasa,
  pr1.id_przyst,
  pr1.nazwa
FROM kurs
INNER JOIN trasa          ON kurs.id_trasa = trasa.id_trasa       
INNER JOIN polaczenie po1 ON kurs.id_trasa = po1.id_trasa
INNER JOIN polaczenie po2 ON kurs.id_trasa = po2.id_trasa
INNER JOIN przystanki pr1 ON pr1.id_przyst = po1.id_przyst
INNER JOIN przystanki pr2 ON pr2.id_przyst = po2.id_przyst
WHERE pr1.nazwa='{$a}' AND pr2.nazwa='{$b}'

存在的示例:

SELECT DISTINCT
  kurs.odjazd,
  kurs.przyjazd,
  kurs.info,
  kurs.id_przew,
  kurs.id_cena,
  kurs.id_kurs,
  kurs.id_trasa,
  pr1.id_przyst,
  pr1.nazwa
FROM kurs
INNER JOIN trasa          ON kurs.id_trasa = trasa.id_trasa       
INNER JOIN polaczenie po1 ON kurs.id_trasa = po1.id_trasa
INNER JOIN przystanki pr1 ON pr1.id_przyst = po1.id_przyst
WHERE EXISTS
(
  SELECT *
  FROM polaczenie po 
  JOIN przystanki pr ON po.id_przyst = pr.id_przyst
  WHERE po.id_trasa = id_trasa
  AND pr.nazwa='{$a}' 
)
AND EXISTS
(
  SELECT *
  FROM polaczenie po 
  JOIN przystanki pr ON po.id_przyst = pr.id_przyst
  WHERE po.id_trasa = id_trasa
  AND pr.nazwa='{$b}' 
)