以下是一些数据:
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 |
-------------------------------------------------
答案 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 中的所有记录。