当前位置:  开发笔记 > 编程语言 > 正文

PHP和MYSQL:如何在JOIN操作中解决模糊列名?

如何解决《PHP和MYSQL:如何在JOIN操作中解决模糊列名?》经验,为你挑选了6个好方法。

我的数据库中有两个表:

新闻('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?

更新:感谢大家的快速解答.别名似乎是最好的解决方案.



1> CMS..:

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

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


@RonInbar.`SELECT*`是大系统中的维护噩梦.您建议添加一个列很简单,如果使用`SELECT*`则不需要对SQL进行任何更改,但是这不是在此处标识的别名问题中的情况.如果新字段很大,它还会产生不必要的性能影响.它还可以破坏期望一定数量或字段的客户端控件.我可以继续,但是当您了解它对可维护性和性能的影响时,"SELECT*"的好处会很快消失.
这种方法的主要缺点是,与`SELECT*`不同,查询与表结构紧密耦合.也就是说,无论何时在架构中添加/删除/重命名列,都必须相应地更改查询.

2> Greg..:

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

SELECT *, user.id AS user_id FROM ...


另请注意,如果您使用wildwarcd`*`,它必须是select子句中的第一个.NOT:`SELECT user_id,*...`

3> 小智..:

我刚想通了.这可能是一个不好的做法,但在这种情况下它对我有用.

我是一个懒惰的人,他不想使用表前缀别名或写出每个列名.

您可以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在第一个例子中将是空白的,那将是一个无赖.


依赖于现在适用于您的无证订购,如果数据库实现发生变化,则不会产生任何错误,这是一个很好的想法.
排序黑客是可怕的,但是能够用`table.*`选择+1以便我可以做`SELECT table1.*,table2.this_one_column_need FROM table1 INNER JOIN table2 ON ...`.

4> Dirk..:

另一个提示:如果你想拥有更干净的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";



5> Paolo Bergan..:

你可以做点什么

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

然后$row['news_id']将是新闻ID $row['user_id']并将成为用户ID



6> GoTo..:

@Jason.你是对的,除了php是罪魁祸首而不是mysql.如果您将自己JOIN放入Mysql Workbench中,您将获得三个具有完全相同名称的列(每个表一个)但不具有相同的数据(null如果该表与该表不匹配,则会有一些列JOIN).

在PHP中,如果你使用MYSQL_NUMin 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中,一些信息会无声地丢失......

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有