You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:00:02