一个快速的问题:
使用时是否可以获得 MySQL 结果,表名在列前面,而不仅仅是列名*?
代替:
column1, column2,ETC
我会需要:
table_name.column1, table_name.column2,ETC
我的问题是,我将多个表连接在一起,这些表具有相同名称的列(例如,key),但结果SELECT只会显示一个。并且在每个连接表中键入每一列,这比简单地使用*并稍后使用 Tablenames 获得结果要多得多。
有什么解决办法吗?
谢谢您的帮助。
我找到了另一个实际按预期工作的解决方案!
显然,这是可能的 - 至少对于 PHP:
$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);
有了这个,我得到了完全限定的列名的结果。我真的很想知道这在 SQL 中的样子,但至少它解决了这个问题。
之前找不到它,感谢@RobinCastlin 提供了进一步的链接(这让我找到了解决方案) - 以及其他人的帮助!
使用 * 选择器是不可能的。大约 4 年前在stackoverflow上已经有人问过这个问题。您将需要键入每一列并使用别名。
即使您不喜欢定义所有这些值,也不一定很难做到:
$arr_keys = array('table_name' => array('column1', 'column2', 'column3'),
'table_name2' => array('column1', 'column2', 'column3'));
$arr_values = array();
foreach(array_keys($arr_keys) as $h)
foreach($arr_keys[$h] as $h2)
$arr_values[] = "{$h}.{$h2} AS '{$h}.{$h2}'";
$str_values = implode(', ', $arr_values);
# Insert $str_values after your SELECT ...
没有简单的方法可以得到这个。
您可以使用动态 SQL(或 PHP)来创建这种类型的查询:
SELECT
table_name.column1 AS `table_name.column1`,
table_name.column2 AS `table_name.column1`,
...
但这值得麻烦吗?
另一种解决方案,仅当您的表在列中没有通用名称时才有效,除了用于连接的键列之外,将使用NATURAL JOIN:
SELECT
table_a.a_id
table_a.column1,
table_a.b_id,
table_b.b_column2
table_b.b_column3
table_b.b_column4
FROM
table_a JOIN table_b
ON table_b . b_id = table_a . b_id ;
会成为:
SELECT
*
FROM
table_a NATURAL JOIN table_b ;
具有相同名称的列将用于连接,并且不会在结果中复制。
缺点是您应该格外小心,不要有任何列(除了加入时使用的键)和(您和任何其他开发人员)不要错误地添加任何列 - 因为这会破坏查询,产生意想不到的结果。