一个简单的问题:
使用*
时,是否可以获取MySQL结果,表名在列前面而不是列名?
而不是:
column1, column2,
等
我需要:
table_name.column1, table_name.column2,
等
我的问题是,我连接了多个表togheter,它们具有相同名称的列(例如key
),但SELECT
的结果只显示一个。在每个连接表中键入每一列,比简单地使用*
并稍后使用表名获得结果要多得多。
有没有解决方案?
感谢您的帮助。
答案 0 :(得分:2)
我找到了另一种实际上按预期工作的解决方案!
显然,至少可以使用PHP:
$ PDO-> setAttribute(PDO :: ATTR_FETCH_TABLE_NAMES,true);
有了这个,我用完全限定的列名返回结果。 我真的很想知道这在SQL中是怎么看的,但至少它解决了这个问题。
Coulndt之前找到它,感谢@RobinCastlin的进一步链接(这让我得到了解决方案) - 以及其他人的帮助!
答案 1 :(得分:0)
使用*选择器是不可能的。大约4年前已经在stackoverflow上提出过这个问题。您需要键入每个列并使用别名。
答案 2 :(得分:0)
即使你不喜欢定义所有这些值,也不一定要这么做:
$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 ...
答案 3 :(得分:0)
没有简单的方法可以解决这个问题。
您可以使用Dynamic 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 ;
具有相同名称的列将用于连接,并且不会在结果中复制。
缺点是你应该极其谨慎地没有任何列(除了用于加入的键)和(你和任何其他开发者)不要错误地添加任何列 - 因为这会破坏查询,产生不期望结果