检查用户是不是存在于其他表中时查询出错
Posted
技术标签:
【中文标题】检查用户是不是存在于其他表中时查询出错【英文标题】:Query goes wrong when checking if the user exists in other table检查用户是否存在于其他表中时查询出错 【发布时间】:2013-10-21 15:01:57 【问题描述】:我有一个查询,其中显示了每个修订的修订和员工列表..
现在我正在尝试显示给定员工是否已经在答案表中有一行..
这是数据库的概述
这是我的工作查询,显示修订和员工列表
SELECT l.id, l.naam, r.id as revision_id, r.beschrijving, e.id as employee_id, e.voornaam, e.achternaam,
FROM lists l
INNER JOIN revisions r ON l.id = r.list_id
INNER JOIN employeelists el ON el.list_id= l.id
INNER JOIN employees e ON e.id = el.employee_id
INNER JOIN customers c ON c.id = e.customer_id
WHERE customer_id = :id AND r.actief = 1
现在我已经尝试了几件事来查看员工是否已经在答案表中有记录。但它一直都失败了。
尝试 1:添加带有左外连接的 Answers 表
SELECT l.id, l.naam, r.id as revision_id, r.beschrijving, e.id as employee_id, e.voornaam, e.achternaam,
**CASE WHEN a.coach_id != 0 THEN 1 ELSE 0 END as FILLED IN**
FROM lists l"""
INNER JOIN revisions r ON l.id = r.list_id
**LEFT OUTER JOIN answers a ON a.revision_id = r.id**
INNER JOIN employeelists el ON el.list_id= l.id
INNER JOIN employees e ON e.id = el.employee_id
INNER JOIN customers c ON c.id = e.customer_id
WHERE customer_id = :id AND r.actief = 1
现在的问题是每个员工都被多次显示...
这是工作数据库的 SQLFiddle,我唯一不能做的就是检查给定的员工 (werknemer) 是否存在于答案 (antwoorden) 表中..
http://sqlfiddle.com/#!2/0c01c/4
知道如何解决这个问题吗?我尝试了一个子查询,但也没有成功。谢谢!
现在查询的问题
我以为我是对的,但还有一个错误。在 answers 表中,它显示了 werknemer_id (employee_id) = 78 的结果。对于修订(修订)1和2
虽然只有修订版 1 的结果(截图如下)
谢谢!
【问题讨论】:
考虑提供适当的 DDL 和/或 sqlfiddle 以及所需的结果集。 嗨草莓!谢谢!我添加了 Sqlfiddle 不就是这么简单吗……? sqlfiddle.com/#!2/0c01c/13 【参考方案1】:如果不在antwoorden
中,则此存在列将有 0,如果存在则为 1
SELECT l.id, l.naam, r.revisie as revisie, r.id as revisie_id, r.beschrijving, w.id as werknemer, w.voornaam, w.achternaam
, a.werknemer_id,
(CASE WHEN a.werknemer_id IS NULL THEN 0 ELSE 1 END ) AS `exist`
FROM lijsten l
INNER JOIN revisies r ON l.id = r.lijst_id
INNER JOIN werknemerlijsten wl ON wl.lijst_id = l.id
INNER JOIN werknemers w ON w.id = wl.werknemer_id
INNER JOIN klanten k ON k.id = w.klant_id
LEFT JOIN antwoorden a ON w.id = a.werknemer_id
WHERE klant_id = 39 AND r.actief = 1
GROUP BY r.beschrijving, w.id
Fiddle
【讨论】:
我想这可能是它!我不明白的是 GROUP BY。我读过它..但是你如何确定你必须分组的内容?谢谢! 只需检查您查询中的重复结果,我注意到您之前的查询中r.beschrijving, w.id
的独特组合,因此我应用了GROUP BY r.beschrijving, w.id
嗯。我现在添加了问题的截图,该死的,我们是如此接近!谢谢你
@MiguelStevens 看到这个小提琴sqlfiddle.com/#!2/0c01c/37 你正在显示r.id AS revisie_id
与lijsten INNER JOIN revisies r ON l.id = r.lijst_id
有一个连接,而不是如果你看到a.revisie_id AS antwoodenrevise
它显示了werknemer_id 78 的修订1。希望它有意义,您的查询很好,但您显示错误的列
我认为已修复! (在某人的帮助下).. 对 LEFT JOIN 使用双重参数.. 这是一个好习惯吗?小提琴:sqlfiddle.com/#!2/4bfc94/1【参考方案2】:
最终解决方案
这是最终结果,仅当所需教练(在这种情况下为 1)在答案表中时,才会看到 'ingevuld' 为 1。
SELECT l.id, l.naam, r.revisie AS revisie, r.id AS revisie_id, r.beschrijving, w.id AS werknemer, w.voornaam, w.achternaam, a.coach_id,
CASE WHEN a.coach_id = 1 THEN 1 ELSE 0 END AS ingevuld
FROM lijsten l
INNER JOIN revisies r ON l.id = r.lijst_id
INNER JOIN werknemerlijsten wl ON wl.lijst_id = l.id
INNER JOIN werknemers w ON w.id = wl.werknemer_id
INNER JOIN klanten k ON k.id = w.klant_id
LEFT JOIN antwoorden a ON w.id = a.werknemer_id AND r.id=a.revisie_id
WHERE klant_id = 39 AND r.actief = 1
group by r.id, w.id, a.coach_id
【讨论】:
以上是关于检查用户是不是存在于其他表中时查询出错的主要内容,如果未能解决你的问题,请参考以下文章