我有以下自定义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。如何为所有上述表使用别名?
答案 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;