mysql中的条件连接

时间:2009-08-10 15:20:00

标签: mysql join conditional

我有一个表id1id2typetype是包含另一个表名称的枚举值。 我想使用join表的名称预先形成type。 例如:

switch($type)
case 'table1':
   join table1;
   break;
case 'table2':
   join table2;
   break;

我怎样才能做到这一点?

4 个答案:

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