簡體   English   中英

SELECT結果與列的表名稱

[英]SELECT result with table names for columns

一個簡單的問題:

使用*時,是否可以獲取MySQL結果,表名在列前面而不是列名?

代替:

column1, column2,

我會需要:

table_name.column1, table_name.column2,

我的問題是,我連接了多個表togheter,它們具有相同名稱的列(例如, key ),但SELECT的結果只顯示一個。 在每個連接表中鍵入每一列,比簡單地使用*以及稍后使用表名獲得結果要多得多。

這有什么解決方案嗎?

謝謝您的幫助。

我發現另一種解決方案實際上按預期工作!

顯然,有可能 - 至少,使用PHP:

$ PDO-> setAttribute(PDO :: ATTR_FETCH_TABLE_NAMES,true);

有了這個,我用完全限定的列名返回結果。 我真的很想知道這在SQL中是怎么看的,但至少它解決了這個問題。

Coulndt之前找到它,感謝@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 ;

具有相同名稱的列將用於連接,並且不會在結果中復制。

缺點是你應該極其謹慎,沒有任何列(除了用於加入的密鑰)和(你和任何其他開發人員)不要錯誤地添加任何列 - 因為這會破壞查詢,產生不期望的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM