使用wpdb->get_results左连接查询时返回错误ID的问题咨询
问题:使用$wpdb->get_results左连接查询时,通配符*导致主键ID被覆盖的原因
我用$wpdb->get_results执行左连接查询时遇到问题:第二条结果里$shipping_table的主键ID被错误地从2改成了1。指定具体列名而非通配符*时查询正常,但我想知道用通配符导致这个问题的原因。
查询代码如下:
$items = $wpdb->get_results(" SELECT * FROM `$shipping_table` s LEFT JOIN `$shipping_type_table` st ON s.shipping_type_id = st.id WHERE s.shipping_active = 1 ORDER BY s.shipping_order ASC; ");
PHP输出结果:
array (size=2) 0 => object(stdClass)[1368] public 'ID' => string '1' (length=1) public 'shipping_name' => string 'UK' (length=2) public 'shipping_amount' => string '10.000' (length=6) public 'shipping_type_id' => string '1' (length=1) public 'shipping_order' => string '1' (length=1) public 'shipping_package' => string '1' (length=1) public 'shipping_active' => string '1' (length=1) public 'shipping_type_name' => string 'fixed' (length=5) public 'shipping_type_active' => string '1' (length=1) 1 => object(stdClass)[1369] public 'ID' => string '1' (length=1) public 'shipping_name' => string 'USA' (length=3) public 'shipping_amount' => string '15.000' (length=6) public 'shipping_type_id' => string '1' (length=1) public 'shipping_order' => string '2' (length=1) public 'shipping_package' => string '0' (length=1) public 'shipping_active' => string '1' (length=1) public 'shipping_type_name' => string 'fixed' (length=5) public 'shipping_type_active' => string '1' (length=1)
但在phpMyAdmin中执行相同查询能返回正确结果,求解答。
解答
这问题本质是重复列名被覆盖:
- 当你用
SELECT *时,会同时取出两个关联表的所有列。如果$shipping_table(别名s)和$shipping_type_table(别名st)都存在名为ID(或大小写不敏感的id)的列,查询结果里会出现两个同名字段。 $wpdb->get_results将结果转为stdClass对象时,对象属性名基于列名生成,后出现的同名字段值会直接覆盖前面的。你的场景里,st表的id值都是1,所以第二条记录原本的s.ID=2被st.ID=1覆盖了。- phpMyAdmin能显示正确结果,是因为它会给重复列自动加上表别名前缀(比如
s.ID、st.ID)来区分,不会合并成同一个键;但$wpdb的对象转换逻辑做不到这点。
如果要继续用类似的查询方式,要么给重复列手动加别名(比如SELECT s.ID AS shipping_id, st.id AS type_id, ...),要么明确指定需要的列,避免列名冲突。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

