【问题标题】:INNER JOIN does not work for meINNER JOIN 对我不起作用
【发布时间】:2025-12-31 15:00:12
【问题描述】:

我试图让我的 SQL 查询工作但我失败了,所以我决定询问更有经验和熟悉 SQL 的人,因为我不是这样。

我有:我的数据库中有 2 个表,一个是“DEV”表,其中包含:id, lat, lon, login, password 第二个是“TASK”表,其中包含:id, lat, lon, address, id_dev。 Id_dev 是表“DEV”的外键。

我要做的是:进行查询以获取所有未分配任务的 DEV(表“任务”中没有具有给定 dev.id 的记录)并获取另一个具有任务的 DEV 列表。

我希望他们分开。我从教程中尝试了一些东西:

SELECT * FROM `dev` INNER JOIN 'task' ON dev.id=task.id_dev ORDER BY dev.id;

但这对我不起作用。请问有什么建议吗? 亲切的问候!

【问题讨论】:

  • “但它对我不起作用” - 这是最好的问题描述吗?不!
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'FROM dev INNER JOIN 'task' ON dev.id=task.id_dev ORDER BY dev.id' 附近使用正确的语法
  • 您预计会发生什么,为什么?教程说了什么?您是否查看了内部连接的作用,以及您期望它做什么?
  • 为数据库对象提供别名并重试。
  • 你需要反引号,而不是'task'周围的单引号,即`task`

标签: mysql sql select join left-join


【解决方案1】:

如果您想要没有“任务”的“开发”记录,则不应使用INNER JOIN,因为这会带回集合的交集。

一种选择是使用LEFT JOIN,例如:

SELECT      dev.* 

FROM        dev

LEFT JOIN   task
    ON      dev.id=task.id_dev 

WHERE       task.id_dev IS NULL

ORDER BY    dev.id;

【讨论】:

  • 谢谢,你是对的,应该使用左连接。完美运行,谢谢
  • 我还有一个问题。我只是在填充我的数据库,当我为单个开发人员分配了超过 1 个任务时,我开始获取克隆记录。有什么办法可以解决吗?提前致谢。
  • 好吧,我想通了,它只是“DISTINCT”关键字。抱歉弄乱了
【解决方案2】:
SELECT * FROM `dev` INNER JOIN 'task' ON dev.id=task.id_dev ORDER BY dev.id;

不要在task 上使用单引号'。查询应如下所示:

SELECT * FROM `dev` INNER JOIN `task` ON dev.id=task.id_dev ORDER BY dev.id;

【讨论】:

  • 这仍然带回了两个集合的交集,而不是“所有没有分配任务的 DEV”
【解决方案3】:

使用LEFT JOIN 代替INNER JOIN

试试这个:

SELECT d.* 
FROM `dev` d 
LEFT JOIN `task` t ON d.id = t.id_dev 
WHERE t.id IS NULL 
ORDER BY d.id;

【讨论】: