我有一个查询,它结合了两个表中的列,如下所示:
SELECT UR.recordId, UR.userName, UN.note
FROM userRecords UR
RIGHT JOIN (
SELECT UR2.recordId
FROM userRecords UR2
WHERE userId = 17
) AS URX USING (recordId)
LEFT JOIN userNotes UN USING(recordId);
这将产生一个结果集,该结果集在'userNotes'表中的每条记录中都有一行,其结果与'userRecords表中的recordId相同,如下所示:
--------------------------------------------------
| recordId | userName | note |
--------------------------------------------------
| 17 | Rob S | apples |
| 17 | Rob S | oranges |
| 17 | Rob S | grapes |
--------------------------------------------------
这是所需的输出。但是,我现在想在userName和note列之间添加一个名为“ hasPhotos”的列,该列将指示“ userPhotos”表中是否有任何记录也具有相同的recordId(17)。
“ userPhotos”表可以包含0到N条记录,且记录ID匹配,就像userNotes表一样。但是,如果没有匹配记录,我希望“ hasPhotos”列仅表示“ false”,如果有1个或更多匹配项,则表示“ true”。我也不希望基于“ userPhotos”表中的记录数来增加结果集中的行数。总行数应仍与“ userNotes”表中找到的记录数匹配。
因此,如果没有匹配的照片记录,其外观应为:
--------------------------------------------------
| recordId | userName | hasPhotos | note |
--------------------------------------------------
| 17 | Rob S | false | apples |
| 17 | Rob S | false | oranges |
| 17 | Rob S | false | grapes |
--------------------------------------------------
并且如果有1个或更多匹配的照片记录,则其外观应为:
--------------------------------------------------
| recordId | userName | hasPhotos | note |
--------------------------------------------------
| 17 | Rob S | true | apples |
| 17 | Rob S | true | oranges |
| 17 | Rob S | true | grapes |
--------------------------------------------------
任何人都可以协助我如何调整查询以完成此任务吗?我尝试了各种方法,但得到了不良结果,例如根据匹配的照片记录增加了行数...
谢谢!
答案 0 :(得分:0)
您可以将EXISTS条件与相关子查询一起使用。
另外,在我看来,现有查询中不需要RIGH JOIN。
我会做的:
SELECT
UR.recordId,
UR.userName,
UN.note,
CASE WHEN EXISTS(
SELECT 1
FROM userPhotos UP
WHERE UP.recordId = UR.recordId
) THEN 'true' ELSE 'false' END hasPhotos
FROM userRecords UR
LEFT JOIN userNotes UN USING(recordId)
WHERE UR.userId = 17
答案 1 :(得分:0)
下面是查询-
SELECT UR.recordId, UR.userName, case when UP.recordId is null then false else true , UN.note
FROM userRecords UR
RIGHT JOIN (
SELECT UR2.recordId
FROM userRecords UR2
WHERE userId = 17
) AS URX USING (recordId)
LEFT JOIN userNotes UN USING(recordId)
left join (select distinct recordId from userPhotos) UP on UR.recordId=UP.recordId