Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检索结果时如何解决不明确的列名?_Php_Sql_Mysql_Mysql Error 1052 - Fatal编程技术网

Php 检索结果时如何解决不明确的列名?

Php 检索结果时如何解决不明确的列名?,php,sql,mysql,mysql-error-1052,Php,Sql,Mysql,Mysql Error 1052,我的数据库中有两个表: 包含列的新闻表: id-新闻id user-作者的用户id) 包含列的用户表: id-用户id 我想执行以下SQL: SELECT * FROM news JOIN users ON news.user = user.id 当我在PHP中得到结果时,我希望通过$row['column-name']获得关联数组和列名。如何获取具有相同列名的新闻ID和用户ID?您可以为正在选择的列设置别名: $query = 'SELECT news.id AS newsId,

我的数据库中有两个表:

包含列的新闻表:

  • id
    -新闻id
  • user
    -作者的用户id)
包含列的用户表:

  • id
    -用户id
我想执行以下SQL:

SELECT * FROM news JOIN users ON news.user = user.id 

当我在PHP中得到结果时,我希望通过
$row['column-name']
获得关联数组和列名。如何获取具有相同列名的新闻ID和用户ID?

您可以为正在选择的列设置别名:

$query = 'SELECT news.id AS newsId, user.id AS userId, [OTHER FIELDS HERE] FROM news JOIN users ON news.user = user.id'

您可以使用数字索引(
$row[0]
),或者在MySQL中更好地使用
AS


选择*,user.id作为用户id从…

您可以执行以下操作

SELECT news.id as news_id, user.id as user_id ....

然后,
$row['news\u id']
将是新闻id,
$row['user\u id']
将是用户id

如果您不想使用别名,也可以在表名前加前缀

这样可以更好地自动生成查询。另外,最好不要使用select*(这显然比只选择所需的字段要慢) 此外,只显式地命名您想要的字段

SELECT
    news.id, news.title, news.author, news.posted, 
    users.id, users.name, users.registered 
FROM 
    news 
LEFT JOIN 
    users 
ON 
    news.user = user.id

我刚想出来。这可能是一个不好的做法,但在这种情况下对我有效

我是一个懒惰的人,不想给每一个列名都加上别名或写上表前缀

您可以使用select语句中的
table\u name.*
从特定表中选择所有列

当您有重复的列名时,mysql将自始至终覆盖。当它再次遇到该列名时,来自第一个重复列名的数据将被覆盖。因此,最后出现的重复列名将获胜

如果我连接3个表,每个表都包含一个重复的列名,select语句中表的顺序将决定我为重复列获取的数据

例如:

SELECT table1.* , table2.* , table3.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;
在上面的示例中,我得到的
dup
的值将来自
表3

如果我想将
dup
作为表1中的值,该怎么办

那么我需要这样做:

SELECT table3.* , table2.* , table1.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;
现在,
table1
排在最后,因此
dup
的值将是table1中的值

我得到了我想要的
dup
的值,而不必写出每一个奇怪的列,而且我仍然可以处理所有的列。耶


我知道
dup
的值在所有3个表中应该是相同的,但是如果
table3
没有与
dup
匹配的值呢?那么
dup
在第一个示例中是空的,这将是一个错误。

我在动态表中也遇到了同样的问题。(假定表具有可以联接的id,但对其余字段不作任何假定)在这种情况下,您不知道这些别名

在这种情况下,可以首先获取所有动态表的表列名:

$tblFields = array_keys($zendDbInstance->describeTable($tableName));
其中$ZendBinInstance是Zend_Db的一个实例,或者您可以使用此处的一个函数来不依赖Zend

然后,对于所有动态表,您可以获取别名并使用$tableName.*对于不需要别名的表:

$aliases = "";
foreach($tblKeys as $field)
    $aliases .= $tableName . '.' . $field . ' AS ' . $tableName . '_' . $field . ',' ;
$aliases = trim($aliases, ',');

您可以将整个过程打包为一个通用函数,只需编写更干净的代码,或者如果愿意,可以更懒一些:)

@Jason。除了php是罪魁祸首而不是mysql之外,您是正确的。如果您将
连接
放在mysql Workbench中,您将得到三个名称完全相同的列(每个表一列)但数据不同(如果该表与
连接不匹配,则一些数据将为
null

在php中,如果您在
MYSQL\u-fetch\u-array()
中使用
MYSQL\u-fetch\u-array()
MYSQL\u-ASSOC
一起使用
MYSQL\u-NUM
,那么您将获得所有列。问题是,当您使用
MYSQL\u-fetch\u-array()

$row['dup'] = [value from table1]
后来

$row['dup'] = [value from table2]


因此,您只能从表3中获得值。问题是mysql的结果集可以包含同名的列,但php中的关联数组不允许数组中存在重复的键。在php中,当数据保存在关联数组中时,一些信息会自动丢失…

另一个提示:如果您想要更干净的php代码,请可以在数据库中创建视图,例如

例如:

CREATE VIEW view_news AS
SELECT
  news.id news_id,
  user.id user_id,
  user.name user_name,
  [ OTHER FIELDS ]
FROM news, users
WHERE news.user_id = user.id;
在PHP中:

$sql = "SELECT * FROM view_news";

有两种方法:

  • 使用别名;在这种方法中,为各个列指定新的唯一名称(别名),然后在PHP检索中使用它们。 e、 g

    然后用PHP获取结果:

    $query = $PDO_stmt->fetchAll();
    
    foreach($query as $q) {
        echo $q['FEES_LINK'];
    }
    
    $query = $PDO_stmt->fetchAll();
    
    foreach($query as $q) {
        echo $q[0];
    }
    
  • 使用place position或resultset列索引;在这种情况下,数组位置用于引用重复的列名。由于它们出现在不同的位置,因此将使用的索引号始终是唯一的。 然而,指数定位数字从0开始

    SELECT student_id, student_class 
    FROM students_fee_tbl 
    LEFT JOIN student_class_tbl ON students_fee_tbl.student_id = student_class_tbl.student_id
    
    然后用PHP获取结果:

    $query = $PDO_stmt->fetchAll();
    
    foreach($query as $q) {
        echo $q['FEES_LINK'];
    }
    
    $query = $PDO_stmt->fetchAll();
    
    foreach($query as $q) {
        echo $q[0];
    }
    

  • 这是对上述问题的回答,既简单又适用于返回的JSON结果。当您使用SELECT*时,SQL查询会自动为相同字段名的每个实例添加表名前缀,但要发送回网页的结果的JSON编码会忽略那些具有重复名称的字段的值,并使用instead返回一个空值

    确切地说,它包括重复字段名的第一个实例,但使其值为空。字段名的第二个实例(在另一个表中)被完全忽略,包括字段名和值。但是,当您直接在数据库上测试查询时(例如使用Navicat),所有字段在结果集中返回。只有当您下次对该结果进行JSON编码时,它们是否具有空值,并且随后的重复名称将被完全忽略

    所以,解决这个问题的一个简单方法是首先
    SELECT *, w.site_name AS wo_site_name FROM ws_work_orders w JOIN ws_inspections i WHERE w.hma_num NOT IN(SELECT hma_number FROM ws_inspections) ORDER BY CAST(w.hma_num AS UNSIGNED);
    
    ...decHTMLifEnc(decodeURIComponent( jsArrInspections[x]["wo_site_name"]))
    
    $sql = "SELECT * FROM news JOIN users ON news.user = user.id";
    $data = $pdo->query($sql)->fetchAll(PDO::FETCH_NAMED);
    foreach ($data as $row) {
        echo $row['column-name'][0]; // from the news table
        echo $row['column-name'][1]; // from the users table
        echo $row['other-column']; // any unique column name
    }