过滤左连接中的数据

时间:2014-06-19 16:04:38

标签: mysql sql join

以下是一些数据:

record
-------------------------------------------------
| id      | name                                |
-------------------------------------------------
| 1       | Round Cookie                        |
| 2       | Square Cookie                       |
| 3       | Oval Cookie                         |
| 4       | Hexagon Cookie                      |
-------------------------------------------------

record_field_data
----------------------------------------------
| id      | record_id | data       | type_id |
----------------------------------------------
| 1       | 1         | White      | 1       |
| 2       | 1         | Round      | 2       |
| 3       | 2         | Green      | 1       |
| 4       | 2         | Square     | 2       |
| 5       | 3         | Blue       | 1       |
| 6       | 3         | Oval       | 2       |
| 7       | 4         | Hexagon    | 2       |
----------------------------------------------

record_type_field
-------------------------------------------------
| id      | data_type                           |
-------------------------------------------------
| 1       | Color                               |
| 2       | Shape                               |
-------------------------------------------------

我正在尝试获取所有与#34; Color"类型的record_field_data连接的记录的列表。这需要是一个左连接,因为可能没有给定类型的record_field_data,如果是这种情况,我仍然需要记录。

这是我提出的查询,但它返回了一个包含ALL record_field_data的左连接,而不仅仅是我想要的特定连接。

SELECT record.id AS id, recordfield.data, recordtype.field_name
FROM record
LEFT JOIN record_field_data AS recordfield ON (record.id = recordfield.record_id)
LEFT JOIN record_type_field AS recordtype ON (recordfield.type_id = recordtype.id AND recordtype.data_type = 'Color');

我可以在JOIN中使用子查询来执行此操作,但我无法使用子查询。我必须将其转换为HQL,并且HQL中不支持子查询以进行连接。

我要找的结果是由record_field_data订购的记录,其中record_type_field.data_type是' Color'。请注意" Hexagon cookie"没有定义颜色,我不知道此时它应该在顶部还是底部。无论哪种方式都可行。

    -------------------------------------------------
    | id      | name                                |
    -------------------------------------------------
    | 3       | Oval Cookie                         |
    | 2       | Square Cookie                       |
    | 1       | Round Cookie                        |
    | 4       | Hexagon Cookie                      |
    -------------------------------------------------

3 个答案:

答案 0 :(得分:1)

SELECT  r.id, r.name
FROM    record r
JOIN    record_type_field rf
ON      rf.data_type = 'Color'
LEFT JOIN
        record_type_data rd
ON      rd.record_id = r.id
        AND rd.type_id = rf.id
ORDER BY
        rd.data

答案 1 :(得分:0)

您是否尝试过使用SQL'IN'子句。

select record.id as id, recordfield.data, recordtype.field_name
from record
left join record_field_data recordfield ON record.id = recordfield.record_id
WHERE id IN (SELECT id FROM record_type_field where data_type='Color');

IN子句允许您指定列表条件。因此,子查询获取类型为“Color”的所有id,然后您正在进行连接并从该连接中选择在与“Color”类型对应的ID列表中具有id的所有记录。

答案 2 :(得分:-1)

您必须将第二次加入更改为INNER JOIN

如果您使用两个LEFT JOIN,则从record中选择record_field_data AND 中的所有记录。