MySQL在表联接之间添加结果列

时间:2019-02-19 07:57:43

标签: mysql

我有一个查询,它结合了两个表中的列,如下所示:

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        |
--------------------------------------------------

任何人都可以协助我如何调整查询以完成此任务吗?我尝试了各种方法,但得到了不良结果,例如根据匹配的照片记录增加了行数...

谢谢!

2 个答案:

答案 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