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,
-新闻idid
-作者的用户id)user
-用户idid
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
}