我的数据库中有两个表:
新闻('id' - 新闻ID,'用户' - 作者的用户ID)
USERS('id' - 用户ID)
我想制作一个SELECT * FROM news JOIN users ON news.user = user.id
,现在当我在PHP中得到结果时,它是这样的:
$row = mysql_fetch_array($result)
,并获取列名$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]
)或更好,AS
在MySQL中使用:
SELECT *, user.id AS user_id FROM ...
我刚想通了.这可能是一个不好的做法,但在这种情况下它对我有用.
我是一个懒惰的人,他不想使用表前缀别名或写出每个列名.
您可以table_name.*
在select语句中使用特定表中的所有列.
如果您有重复的列名,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
我得到的值将来自table3
.
如果我想dup
成为价值table1
怎么办?
然后我需要这样做:
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
在第一个例子中将是空白的,那将是一个无赖.
另一个提示:如果你想拥有更干净的PHP代码,你可以在数据库中创建一个VIEW,例如
例如:
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";
你可以做点什么
SELECT news.id as news_id, user.id as user_id ....
然后$row['news_id']
将是新闻ID $row['user_id']
并将成为用户ID
@Jason.你是对的,除了php是罪魁祸首而不是mysql.如果您将自己JOIN
放入Mysql Workbench中,您将获得三个具有完全相同名称的列(每个表一个)但不具有相同的数据(null
如果该表与该表不匹配,则会有一些列JOIN
).
在PHP中,如果你使用MYSQL_NUM
in mysql_fetch_array()
那么你将获得所有列.问题是当你使用mysql_fetch_array()
时MYSQL_ASSOC
.然后,在该函数内部,php正在构建返回值,如下所示:
$row['dup'] = [value from table1]
后来......
$row['dup'] = [value from table2]
...
$row['dup'] = [value from table3]
所以你只得到table3的值.问题是mysql的结果集可以包含具有相同名称的列,但php中的关联数组不允许在数组中使用重复键.当数据保存在关联数组中时,在php中,一些信息会无声地丢失......