【问题标题】:conditional join in mysqlmysql中的条件连接
【发布时间】:2010-11-18 08:03:37
【问题描述】:

我有一张桌子id1id2typetype 是一个枚举值,其中包含另一个表的名称。 我想使用type 的表名来执行join。 例如:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: mysql join conditional


    【解决方案1】:

    丑陋的方式:

    表类型,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'
    

    【讨论】:

    • 这不就是“方式”吗?停止使用我的名字。
    • 这是“A”方式。看起来很丑,希望有更好的。但是,除“SELECT * FROM X”之外的大多数 SQL 对我来说都很难看;)
    • 史蒂夫别和自己打架了:P
    • 因为做左连接确实有一些缺点,(不排除一个的东西),这是我的一个!
    【解决方案2】:

    你不能直接那样做......你可以这样做(不是很漂亮......):

    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'
    

    【讨论】:

    • 如果 t.type 为 t2,mysql 是否会在表 t3 中搜索一行?
    • +1 对于这个不错的解决方案,但您可能已经指出,将条件放入 ON 子句就可以了。我首先错过了这一点,并认为此查询从两个表中获取所有行(如果您不使用唯一键,每个表可能不止一行),然后您只需忽略错误JOINed 的列。但是这样你会得到条件为假的NULLs。
    • 这是最干净的解决方案。谢谢。
    • 在选定的字段中结合IF(t.type= 't2', t2.id, t3.id) as type_id之类的东西,按照Ilan的建议,很完美,谢谢! ?
    【解决方案3】:

    除了上一个答案: 您可以使用IF 语句组合两个左连接结果:

    IF(t.type= 't2', t2.id, t3.id) as type_id
    

    您可以在mysqldiary.com 看到另一个mysql conditional joins 示例

    【讨论】:

      【解决方案4】:

      我需要用 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=?

      【讨论】:

      • 您愿意分享您的 Eloquent 代码吗?我有一种情况,我试图从我的相关表(变形关系)中返回一个字段,但遇到了困难!
      • @Zakalwe 我没有使用 Eloquent。如果您能详细说明您的问题,也许我可以提供帮助。
      • 对不起。这是我正在使用的查询生成器,但设法解决了这个问题。不过,感谢您提供帮助。
      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      相关资源
      最近更新 更多