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'
您可以使用数字索引(
$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
}