我有一个表id1
,id2
,type
。 type
是包含另一个表名称的枚举值。
我想使用join
表的名称预先形成type
。
例如:
switch($type)
case 'table1':
join table1;
break;
case 'table2':
join table2;
break;
我怎样才能做到这一点?
答案 0 :(得分:18)
你不能直接这样做......你可以做这样的事情(不是很漂亮......):
SELECT
t.id,
t.type,
t2.id AS id2,
t3.id AS id3
FROM t
LEFT JOIN t2 ON t2.id = t.id AND t.type = 't2'
LEFT JOIN t3 ON t3.id = t.id AND t.type = 't3'
答案 1 :(得分:6)
表类型,T1,T2:
SELECT ... FROM Types, T1 , where Types.ID=T1.Types_ID AND Types.TYPE='TABLE1'
UNION
SELECT ... FROM Types, T2 , where Types.ID=T2.Types_ID AND Types.TYPE='TABLE2'
答案 2 :(得分:4)
除了之前的回答: 您可以使用IF语句组合两个左连接结果: IF(t.type ='t2',t2.id,t3.id)为type_id
您可以在mysqldiary.com上看到另一个mysql conditional joins示例
答案 3 :(得分:0)
我需要用 Laravel Query Builder 实现这样的事情。我正在准备一个库,不应该重建整个查询,我想尽可能多地利用 Eloquent,所以我只能向查询添加连接。这可能更接近您想要的,但也比您预期的要丑得多:
SELECT
`comments`.*,
`commentable`.`created_at` AS `commentable_created_at`
FROM
`comments`
LEFT JOIN ((
SELECT
*,
CONCAT('post_', `id`) AS `morphed_key`
FROM
`posts`)
UNION (
SELECT
*,
CONCAT('image_', `id`) AS `morphed_key`
FROM
`images`)) AS `commentable` ON
CONCAT(`comments`.`commentable_type`, '_', `comments`.`commentable_id`)= `commentable`.`morphed_key`
使用这种方式的要点是您现在可以添加 WHERE
子句,如 WHERE commentable.owner_id=?