【问题标题】:Query SQL based on records that does not exist根据不存在的记录查询 SQL
【发布时间】:2016-05-04 08:02:01
【问题描述】:

暂时无法使此查询正常工作:

我有 3 张桌子:

table 1. projects
         -> id, name, ....

table 2. members
         -> user_id, project_id, ...

table 3. links
         -> user_id, project_id, is_binded

我想达到的目标:

从projects获取所有projects.id和projects.name, 但只有与用户耦合的项目 (members.user_id)

AND where is_binded = false(但仅限用户的项目)

或

(这部分我想不通)当不存在包含 user_id、project_id 和 is_binded 列的记录时。因此,当项目和 user_id 尚未在链接表中时。

基本上,查询应该返回来自用户的所有未绑定或链接表中没有记录的项目。

查询出来了:

SELECT p.id, p.name FROM projects p 
JOIN links ml ON p.id = ml.project_id 
JOIN members m on p.id = m.project_id 
WHERE m.user_id = #{u_id} 
AND 
(ml.is_binded IS NULL OR (ml.is_binded = 0 AND ml.user_id = #{u_id}))

返回不在表中但不是基于用户的项目。当 links 中的记录带有 project_id 和 user_id 时,我不再获得其他 user_id 的列表。 #{u_id} 是我在 ruby​​ 中使用的变量。

我希望我的问题有点清楚!

【问题讨论】:

标签: mysql


【解决方案1】:

试试这个,用于 SQL Server

SELECT DISTINCT p.*
FROM    projects p
INNER JOIN  members m   ON m.project_id = p.id
LEFT JOIN   links   l   ON l.project_id = p.id and l.user_id = m.user_id
WHERE m.user_id = ?
 AND IFNULL(is_binded,'false') = 'false'

【讨论】:

  • 看起来是个不错的测试路线,但你在哪里指定 user_id。它应该只返回链接到 members.user_id 的项目
  • 返回:在 'is null(is_binded,'false') = 'false' 附近使用错误的语法,其中 m.user_id = 32 LIMIT 0, 30' 在第 5 行
  • 请检查修改后的答案,希望您使用的是sql server,mysql和sql-server都标记在这个问题中。
  • 我只用mysql,对不起!
  • 你可以使用 IFNULL,而不是 mysql 中的 ISNULL,查询已修改,请检查。这只是一个示例查询逻辑,可以帮助您,因为我不知道您的实际架构、数据类型或数据,您可以根据您的要求进行修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多