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 结果的主要内容,如果未能解决你的问题,请参考以下文章