如何为多个LEFT OUTER JOIN添加别名

时间:2017-02-28 10:57:10

标签: mysql

我有以下自定义SQL,允许按分类列对自定义帖子类型进行排序。它可以工作,但是当自定义帖子被另一个分类法过滤时会出现问题。基本上,按分类法过滤和排序时会发生冲突。

当前代码:

$clauses[ 'join' ] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID=object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING term_taxonomy_id
LEFT OUTER JOIN {$wpdb->terms} USING term_id
SQL;

$clauses[ 'where' ] .= " AND (taxonomy = '" . $orderby . "' AND taxonomy IS NOT NULL)";
$clauses[ 'groupby' ] = "object_id";
$clauses[ 'orderby' ] = "GROUP_CONCAT(name ORDER BY name ASC) " . $order;

导致数据库错误:

Not unique table/alias: 'wp_term_relationships'

这是因为由于分类过滤器已经引用了wp_term_relationships。

修复?

$clauses[ 'join' ] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID=tr.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} tt USING tr.term_taxonomy_id
LEFT OUTER JOIN {$wpdb->terms} tms USING tt.term_id
SQL;

$clauses[ 'where' ] .= " AND (tt.taxonomy = '" . $orderby . "' AND tt.taxonomy IS NOT NULL)";
$clauses[ 'groupby' ] = "tr.object_id";
$clauses[ 'orderby' ] = "GROUP_CONCAT(tms.name ORDER BY tms.name ASC) " . $order;

我的尝试修复有问题,但我无法通过示例告诉我哪里出错了。我怀疑不是所有东西都需要别名。看来除了第一个JOIN中的{$wpdb->posts}.ID之外,它们都需要被隔离。

以上设置查询的orderby。如何为所有上述表使用别名?

1 个答案:

答案 0 :(得分:1)

尝试assigni别名

$clauses[ 'join' ] .= <<<SQL
   LEFT OUTER JOIN {$wpdb->term_relationships}  as t_rel ON {$wpdb->posts}.ID= t_rel.object_id
   LEFT OUTER JOIN {$wpdb->term_taxonomy} USING t_rel.term_taxonomy_id
   LEFT OUTER JOIN {$wpdb->terms} USING term_id
SQL;

让我们尝试使用条件而不是USING(希望列名是权利)

  $clauses[ 'join' ] .= <<<SQL
     LEFT OUTER JOIN {$wpdb->term_relationships}  as t_rel ON {$wpdb->posts}.ID= t_rel.object_id
     LEFT OUTER JOIN {$wpdb->term_taxonomy} as tt ON tt.id =  t_rel.term_taxonomy_id
     LEFT OUTER JOIN {$wpdb->terms} as te ON te.id =  tt.term_id
  SQL;