MySQL 终端结果!= PHP->MySQL 结果

Posted

技术标签:

【中文标题】MySQL 终端结果!= PHP->MySQL 结果【英文标题】:MySQL terminal results != PHP->MySQL results 【发布时间】:2018-06-16 17:46:21 【问题描述】:

我试图弄清楚为什么通过 mysql 终端查询返回的结果与 php 执行的 MySQL 查询返回的结果不匹配。

这是shell中使用的MySQL:

SELECT * FROM SANKEY_NODE AS n
  LEFT OUTER JOIN TYPE_DETAIL as td
    ON n.TYPE_DETAIL_ID = td.TYPE_DETAIL_ID
  LEFT OUTER JOIN GRAPH_TYPE as t
    ON td.GRAPH_TYPE_ID = t.GRAPH_TYPE_ID
WHERE CHART_ID = 39;

这是 PHP:

function get_nodes_by_chart_id($con, $chart_id) 
  $sql = 'SELECT * FROM SANKEY_NODE AS n
            LEFT OUTER JOIN TYPE_DETAIL as td
              ON n.TYPE_DETAIL_ID = td.TYPE_DETAIL_ID
            LEFT OUTER JOIN GRAPH_TYPE as t
              ON td.GRAPH_TYPE_ID = t.GRAPH_TYPE_ID
          WHERE CHART_ID = '.$chart_id.';';
  $result = mysqli_query($con, $sql);
  return results_to_array($result);


function results_to_array($results) 
  $rows = array();
  while($row = mysqli_fetch_assoc($results)) 
    $rows[] = $row;
  
  return $rows;

这两个查询都返回十几个结果,但是它们在三个结果的表示上有所不同。这三个结果很特殊,因为它们在 SANKEY_NODE 表中有一个 TYPE_DETAIL_ID 值,而 TYPE_DETAIL 表中没有。

在 MySQL shell 中,显示三个受影响节点的 TYPE_DETAIL_ID 值,而在 PHP 返回的结果中,TYPE_DETAIL_ID 值为空。有谁知道可能导致这种差异的原因是什么?如果其他人能提供任何见解,我将不胜感激!

表结构

mysql> describe SANKEY_NODE;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| NODE_NAME      | varchar(100) | NO   |     | NULL    |       |
| NODE_PARENT    | varchar(20)  | YES  |     | NULL    |       |
| CHART_ID       | int(11)      | NO   | PRI | NULL    |       |
| NODE_TYPE      | varchar(100) | NO   |     | NULL    |       |
| TYPE_DETAIL_ID | varchar(20)  | NO   | PRI | NULL    |       |
+----------------+--------------+------+-----+---------+-------+

mysql> describe TYPE_DETAIL;
+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| COMPANY_ID       | int(11)      | NO   |     | NULL    |       |
| GRAPH_TYPE_ID    | int(11)      | NO   | PRI | NULL    |       |
| TYPE_DETAIL_CD   | varchar(20)  | NO   | PRI | NULL    |       |
| TYPE_DETAIL_NAME | varchar(100) | NO   |     | NULL    |       |
| TYPE_DETAIL_DESC | varchar(200) | YES  |     | NULL    |       |
| TYPE_DETAIL_ID   | int(11)      | NO   |     | NULL    |       |
| TYPE_IMAGE_ID    | int(11)      | YES  |     | NULL    |       |
| ACTIVE_FLAG      | bit(1)       | NO   |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+

mysql> describe GRAPH_TYPE;
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| COMPANY_ID           | int(11)      | NO   | PRI | NULL    |                |
| GRAPH_TYPE_ID        | int(11)      | NO   | UNI | NULL    | auto_increment |
| TYPE_CD              | varchar(20)  | NO   | PRI | NULL    |                |
| TYPE_NAME            | varchar(100) | NO   |     | NULL    |                |
| TYPE_COLOR           | varchar(50)  | NO   |     | NULL    |                |
| TYPE_HIGHLIGHT_COLOR | varchar(50)  | NO   |     | NULL    |                |
| ACTIVE_FLAG          | bit(1)       | NO   |     | NULL    |                |
+----------------------+--------------+------+-----+---------+----------------+

评论回复

@Cedric,仅使用第一个 JOIN 运行查询会产生相同的结果。 TYPE_DETAIL_ID 存在于 SANKEY_NODE 但不存在于 TYPE_DETAIL_ID 中的三个值在 shell 结果中定义了 TYPE_DETAIL_ID,但在 PHP 的结果中没有定义(参见下面的结果)。至于语法,我很喜欢“显式胜于隐式”的哲学。

@jcaron,TYPE_DETAIL_ID 值是整数序列或 ascii 字符串,例如:

mysql> SELECT * FROM SANKEY_NODE AS n   LEFT OUTER JOIN TYPE_DETAIL as td     ON n.TYPE_DETAIL_ID = td.TYPE_DETAIL_ID WHERE CHART_ID = 3;
+--------------------------+-------------+----------+-------------+----------------+------------+---------------+----------------+--------------------+--------------------+----------------+---------------+-------------+
| NODE_NAME                | NODE_PARENT | CHART_ID | NODE_TYPE   | TYPE_DETAIL_ID | COMPANY_ID | GRAPH_TYPE_ID | TYPE_DETAIL_CD | TYPE_DETAIL_NAME   | TYPE_DETAIL_DESC   | TYPE_DETAIL_ID | TYPE_IMAGE_ID | ACTIVE_FLAG |
+--------------------------+-------------+----------+-------------+----------------+------------+---------------+----------------+--------------------+--------------------+----------------+---------------+-------------+
| CRD                      | SYS         |        3 | System      | 101004         |       7777 |             1 | CRD            | Charles River      | Charles River      |         101004 |          NULL |            |
| FactSet                  | SYS         |        3 | System      | 101012         |       7777 |             1 | FACTSET        | Factset            | Factset            |         101012 |          NULL |            |
| MSCI                     | SYS         |        3 | System      | 101016         |       7777 |             1 | RISKMETRICS    | MSCI RiskWorld     | MSCI RiskWorld     |         101016 |          NULL |            |
| Trade Execution          | FUN         |        3 | Function    | 109007         |       7777 |             9 | TE             | Trade Execution    | Trade Execution    |         109007 |          NULL |            |
| Portfolio Mgmt           | FUN         |        3 | Function    | 109003         |       7777 |             9 | PM             | Portfolio Mgmt     | Portfolio Mgmt     |         109003 |          NULL |            |
| Performance & Risk       | FUN         |        3 | Function    | 109002         |       7777 |             9 | PMR            | Performance & Risk | Performance & Risk |         109002 |          NULL |            |
| Operations               | FUN         |        3 | Function    | 109006         |       7777 |             9 | OPS            | Operations         | Operations         |         109006 |          NULL |            |
| Decision Making          | FUN         |        3 | Function    | 109001         |       7777 |             9 | DM             | Decision Making    | Decision Making    |         109001 |          NULL |            |
| Compliance               | FUN         |        3 | Function    | 109005         |       7777 |             9 | COMP           | Compliance         | Compliance         |         109005 |          NULL |            |
| Portfolio Rebalance      | SFUN        |        3 | SubFunction | 201091         |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| Position Reconciliation  | SFUN        |        3 | SubFunction | 201092         |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| PreTrade Compliance      | SFUN        |        3 | SubFunction | 201096         |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| Step-outs                | SFUN        |        3 | SubFunction | 201109         |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| Trade Matching           | SFUN        |        3 | SubFunction | 201125         |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| Trade Settlement         | SFUN        |        3 | SubFunction | 201129         |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| Functions                |             |        3 | Function    | FUN            |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| SubFunction              |             |        3 | SubFunction | SFUN           |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
| Systems                  |             |        3 | System      | SYS            |       NULL |          NULL | NULL           | NULL               | NULL               |           NULL |          NULL | NULL        |
+--------------------------+-------------+----------+-------------+----------------+------------+---------------+----------------+--------------------+--------------------+----------------+---------------+-------------+
18 rows in set, 225 warnings (0.00 sec)

【问题讨论】:

如果删除“OUTER”关键字会怎样?它应该给出完全相同的结果,所以越短越好。 这些 id 是什么样的?由于您使用的是 varchar,因此您可能会使用特殊字符(重音字符等)并在两个客户端中使用不同的语言环境,这会产生不同的结果。请提供相关数据。 有两列都称为 TYPE_DETAIL_ID,所以 PHP 可能只给你其中之一。您可以尝试在 SELECT 语句中准确命名您想要的列,如果您需要这两列,您可能需要将其中一个列别名为不同的名称 您的查询中可能存在 SQL 注入,请查看 ***.com/questions/16282103/… 并使用参数或转义字符串以确保安全。 @duhaime 我不在电脑前,所以我无法检查,但我认为 php 会给你最右边的同名列,而命令行 mysql 给你两列.重复的列名由客户端处理,因此客户端之间的行为可能会有所不同。 【参考方案1】:

这是一个简单的解决方法,为每一列指定表名:

SELECT SANKEY_NODE.TYPE_DETAIL_ID FROM SANKEY_NODE AS n

这样,您一定会得到您期望的数据

【讨论】:

耶!非常感谢@Cedric!

以上是关于MySQL 终端结果!= PHP->MySQL 结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mac os 10.13.3 中重置我的 mysql 密码

php mysq模糊查询l

ECS 部署 MySQ(CentOS8 安装MySQL8)

mysql忘记密码重置(mac)

ECharts+PHP+MySQ+ Ajax 实现图表绘制

Linux 环境下 MySQ导入和导出MySQL的sql文件