【问题标题】:$wpdb->get_results query returns different (wrong) results compared to phpmyadmin与 phpmyadmin 相比,$wpdb->get_results 查询返回不同(错误)的结果
【发布时间】:2018-10-29 07:08:21
【问题描述】:

我的数据库中有 4 个自定义表 - wp_api_teamswp_api_matcheswp_api_competitionswp_api_federations。它们是我的 Wordpress 数据库的一部分,它们的外观是这样的(我使用的是外键等等):

我正在尝试输出属于联盟的所有团队。当我在 phpmyadmin 中运行它时,它可以工作:

SELECT
    wp_api_teams.team_id,
    wp_api_teams.title,
    wp_api_competitions.comp_id,
    wp_api_competitions.title,
    wp_api_federations.federation_id,
    wp_api_federations.title
FROM
    wp_api_teams
JOIN wp_api_matches
    ON wp_api_teams.team_id = wp_api_matches.hometeam_id OR wp_api_teams.team_id = wp_api_matches.awayteam_id
JOIN wp_api_competitions
    ON wp_api_matches.comp_id = wp_api_competitions.comp_id
JOIN wp_api_federations
    ON wp_api_competitions.federation_id = wp_api_federations.federation_id
WHERE wp_api_federations.federation_id = 1
GROUP BY (wp_api_teams.team_id);

我得到了我正在寻找的确切结果。

-----------------------------------------------------------------------------------
| team_id | title              | comp_id | title          | federation_id | title |
  1         Arsenal              1         Premier League   1               England
  2         Chelsea              1         Premier League   1               England
  3         Liverpool            1         Premier League   1               England
  4         Manchester United    1         Premier League   1               England
  5         Manchester City      1         Premier League   1               England

这是我在 Wordpress 中使用的代码:

global $wpdb;
$sql = "
SELECT
    wp_api_teams.team_id,
    wp_api_teams.title,
    wp_api_competitions.comp_id,
    wp_api_competitions.title,
    wp_api_federations.federation_id,
    wp_api_federations.title
FROM
    wp_api_teams
JOIN wp_api_matches
    ON wp_api_teams.team_id = wp_api_matches.hometeam_id OR wp_api_teams.team_id = wp_api_matches.awayteam_id
JOIN wp_api_competitions
    ON wp_api_matches.comp_id = wp_api_competitions.comp_id
JOIN wp_api_federations
    ON wp_api_competitions.federation_id = wp_api_federations.federation_id
WHERE wp_api_federations.federation_id = 1
GROUP BY wp_api_teams.team_id
";
$test = $wpdb->get_results($sql);
echo('<pre>');
print_r($test);
echo('</pre>');

我得到的结果是缺少两个表列:

Array
(
    [0] => stdClass Object
        (
            [team_id] => 1
            [title] => England
            [comp_id] => 1
            [federation_id] => 1
        )
    [1] => stdClass Object
        (
            [team_id] => 2
            [title] => England
            [comp_id] => 1
            [federation_id] => 1
        )

....等等。

如您所见,结果中缺少wp_api_teams.titlewp_api_competitions.title 列。

所以我的问题是,为什么会发生这种情况,为什么这些列被省略了,我能做些什么来解决这个问题,因为我在返回的结果中绝对需要它们。相同的查询如何在 WP vs PHPmyadmin 中产生不同的结果。

这是一个已知的错误还是我的代码有问题?

我在localhost 上运行10.2.14-MariaDB,所有表引擎都是InnoDB

【问题讨论】:

    标签: mysql sql wordpress phpmyadmin mariadb


    【解决方案1】:

    结果集中的列名相同。您需要提供别名:

    global $wpdb;
    $sql = "
    SELECT
        wp_api_teams.team_id,
        wp_api_teams.title as team_title,
        wp_api_competitions.comp_id,
        wp_api_competitions.title as competition_title,
        wp_api_federations.federation_id,
        wp_api_federations.title as federation_title
    FROM
        wp_api_teams
    JOIN wp_api_matches
        ON wp_api_teams.team_id = wp_api_matches.hometeam_id OR wp_api_teams.team_id = wp_api_matches.awayteam_id
    JOIN wp_api_competitions
        ON wp_api_matches.comp_id = wp_api_competitions.comp_id
    JOIN wp_api_federations
        ON wp_api_competitions.federation_id = wp_api_federations.federation_id
    WHERE wp_api_federations.federation_id = 1
    GROUP BY wp_api_teams.team_id
    ";
    $test = $wpdb->get_results($sql);
    echo('<pre>');
    print_r($test);
    echo('</pre>');
    

    【讨论】:

    • 有效!非常感谢伙计,我花了 3-4 个小时试图找出问题所在。我绝对不知道我需要为表列提供别名,而不是 SQL 专家,所以我认为这可能是 Wordpress 错误。非常感谢。
    • wordpress 的 get_results() 能做到这一点让我有点惊讶。我认为最好抛出一个错误,或者将重复项即时重命名为title_2title_3 之类的通用名称。这肯定会导致一些混乱!
    • 是的,当然。在发布之前,我偶然发现了这个线程stackoverflow.com/questions/41563573/…,所以我认为这可能是 wordpress 本身的一个错误。某种错误输出肯定会受到欢迎并节省一些时间。
    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 2012-12-18
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多