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'

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

$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从…

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


选择*,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 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*(这显然比只选择所需的字段慢) 此外,只显式地命名您想要的字段

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
在第一个示例中是空的,这将是一个错误。

我刚刚发现了这一点。这可能是一个不好的做法,但在这种情况下对我有效

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

您可以使用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, ',');

您可以将整个过程包装到一个通用函数中,只需编写更干净的代码,或者如果您愿意的话可以变得更懒:)

我对动态表也有同样的问题。(假设表具有可以连接的id,但对其余字段没有任何假设。)在这种情况下,您事先不知道别名

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

$tblFields = array_keys($zendDbInstance->describeTable($tableName));

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

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
$query = $PDO_stmt->fetchAll();

foreach($query as $q) {
    echo $q[0];
}
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
}