【问题标题】:Unknown column in on clause error when joining four tables连接四个表时 on 子句中出现未知列
【发布时间】:2019-12-06 22:06:03
【问题描述】:

我想加入四个表,我写了很多可能的方式,但我得到了一个未知列的错误,我不明白出了什么问题。

这是我写的:

SELECT
  kursai.pavadinimas,
  destytojai.vardas AS d_vardas,
  destytojai.pavarde AS d_pav,
  vartotojai.vardas AS v_vardas,
  vartotojai.pavarde AS v_pav
FROM
  kursai,
  (
    vartotojai,
    (
      destytojai
    LEFT JOIN
      pasirinkti_kursai AS p1 ON destytojai.vardas = p1.destytojas_id
    LEFT JOIN
      pasirinkti_kursai AS p2 ON destytojai.pavarde = p2.destytojas_id
    )
  LEFT JOIN
    pasirinkti_kursai AS p3 ON vartotojai.vardas = p3.vartotojas_id
  LEFT JOIN
    pasirinkti_kursai AS p4 ON vartotojai.pavarde = p4.vartotojas_id
  )
LEFT JOIN
  pasirinkti_kursai AS p0 ON kursai.pavadinimas = p0.kursas_id

你能告诉我应该如何编写代码吗?这是我第一次写 SQL 代码,我不知道该做什么了 :(

更新:

这些其他表格应该是这样的:

CREATE TABLE `vartotojai` 
  `elpastas` varchar(30) NOT NULL,
  `slaptazodis` varchar(20) NOT NULL,
  `vardas` varchar(20) NOT NULL,
  `pavarde` varchar(30) NOT NULL,
  `gimimo_data` date NOT NULL,
  `id` int(5) NOT NULL

CREATE TABLE `destytojai`
  `id` int(5) NOT NULL,
  `vardas` varchar(20) NOT NULL,
  `pavarde` varchar(30) NOT NULL

CREATE TABLE `kursai` (
  `id` int(5) NOT NULL,
  `pavadinimas` varchar(3) CHARACTER SET latin1 NOT NULL,
  `aprasas` text CHARACTER SET latin1 NOT NULL,
  `laikas` date NOT NULL,
  `kaina_teor` decimal(5,2) NOT NULL,
  `kaina_prak` decimal(5,2) NOT NULL,
  `kaina_abu` decimal(6,2) NOT NULL,
  `vietu_sk` int(3) NOT NULL,
  `teor_val` int(3) NOT NULL,
  `prakt_val` int(3) NOT NULL,
  `foto_url` varchar(1000) COLLATE utf16_lithuanian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_lithuanian_ci;

CREATE TABLE `pasirinkti_kursai` (
  `kursas_id` int(5) NOT NULL,
  `destytojas_id` int(5) NOT NULL,
  `vartotojas_id` int(5) NOT NULL,
  `id` int(5) NOT NULL,
  `kaina` decimal(7,0) NOT NULL,
  `patvirtinta` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 如果要连接三个表,为什么查询有五个left joins?通常两个就足够了。
  • 正如我所提到的,这是我第一次编写 SQL 代码,所以我不知道该使用什么
  • @GordonLinoff 你能告诉我怎么写吗?因为我尝试使用较少的“左连接”,但又遇到了另一个错误
  • @AliG.:请以表格文本的形式向我们展示这三个表格中的示例数据以及您的预期结果,以便有人可以提供解决方案。
  • 这能回答你的问题吗? Mixing implicit and explicit JOINs

标签: mysql sql join left-join


【解决方案1】:

你正在寻找这样的东西。

注意我使用了左连接,因为我对你的数据一无所知。

你也应该尝试内连接而不是左连接,看看你想要的所有数据是否仍然存在。

还有一个建议用于表别名,正如您所见,它减少了输入

SELECT
  k.pavadinimas,
  d.vardas AS d_vardas,
  d.pavarde AS d_pav,
  v.vardas AS v_vardas,
  v.pavarde AS v_pav
  FROM 
    kursai k
    LEFT JOIN pasirinkti_kursai pk ON k.id = pk.kursas_id
    LEFT JOIN destytojai d ON d.id  = pk.destytojas_id
    LEFT join  vartotojai v ON v.id = pk.vartotojas_id

【讨论】:

    【解决方案2】:

    这两种解决方案都不适用于 LEFT JOIN 或其他连接(使用 nbk 提供的解决方案,我的结果为 NULL),所以我在没有任何 JOINS 的情况下编写它:

    SELECT
      kursai.pavadinimas,
      destytojai.vardas,
      destytojai.pavarde,
      vartotojai.vardas,
      vartotojai.pavarde
    FROM
      `pasirinkti_kursai`,
      kursai,
      destytojai,
      vartotojai
    WHERE
      pasirinkti_kursai.kursas_id = kursai.id AND pasirinkti_kursai.destytojas_id = destytojai.id AND pasirinkti_kursai.vartotojas_id = vartotojai.id
    

    【讨论】:

    • 这些是旧式连接。您应该使用新语法,而不是 this。
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多