簡體   English   中英

MySQL連接2表具有相同的列名,不使用別名

[英]Mysql join 2 table with same column name without using an alias

我得到了這個示例,但是我想從總體上知道如何在不使用別名的情況下在MySQL中獲取具有相同名稱的2列?

例:

 $query = "SELECT app.*, categorie.* FROM app JOIN categorie ON app.id = categorie.id";

 while ($row = mysql_fetch_array($query)) {
     $categorie = $row[categorie.name]; //is there a way to do this?
     $aplicativo = $row[app.name];
 }

這個例子只是用別名來解決,但是還有另一種方式,例如這個例子嗎? 感謝您的時間

mysql_fetch_array

警告

自PHP 5.5.0起不推薦使用此擴展,以后將刪除 相反,應使用MySQLi或PDO_MySQL擴展。 另請參見MySQL:選擇API指南和相關的FAQ,以獲取更多信息。 此功能的替代方法包括:

mysqli_fetch_array()
PDOStatement::fetch()

如果結果的兩列或更多列具有相同的字段名稱,則最后一列優先。 要訪問其他相同名稱的列,必須使用該列的數字索引或為該列創建別名 對於別名列,您無法使用原始列名訪問內容。

Example#1使用別名重復的字段名稱進行查詢

SELECT table1.field AS foo, table2.field AS bar FROM table1, table2

因此,在您的情況下,如文檔所建議的那樣,查詢應使用別名或數字索引:

SELECT app.name as "app.name",... , categorie.name as "categorie.name",... FROM app JOIN categorie ON app.id = categorie.id

提取行時,請使用PDO的FETCH_NUM類型,以獲取包含兩個值的0索引數組,即使它們具有相同的列名也是如此。

function selectStuff(\PDO $pdo)
{
    $stmt = $pdo->prepare('SELECT app.name, categorie.name FROM app JOIN categorie ON app.id = categorie.id');
    $stmt->execute();
    foreach ($stmt->fetchAll(\PDO::FETCH_NUM) as $row) {
        // $row[0] contains app.name
        // $row[1] contains categorie.name
    }
}

您必須利用列的0索引提取來做到這一點而無需別名。 原因很簡單:如果邏輯上共享同一個鍵,則無法在邏輯上訪問數組中的兩個不同值。

注意,我明確地命名了要選擇的列。 出於可讀性的原因,您應該寧願選擇所有字段,而出於性能的原因,(最好是在大多數情況下這並不明顯),您應該更喜歡選擇所有字段。

免責聲明:mysql_fetch_array()我知道這不是值得推薦的日子,但是到目前為止,我還沒有離開,因為它在我所在的任何PHP 5.x服務器上仍然運行良好。 很快時間到了,這樣我就可以重構我的代碼庫,就我所知,maby甚至更快。 話雖如此...

回到您的問題...

我一直在使用Google搜索,正在尋找閱讀后還能看到的東西,但是我開始理解,能夠閱讀您所要求的整個方法在現實世界中沒有實際用途。 也就是說,與更改查詢相比,添加一些別名是這樣的:

$ query =“選擇app.name AS appname,categorie.name AS categoriename,app。 ,categorie。FROM app JOIN categorie ON app.id = categorie.id”;

這樣,您返回的查詢將返回更多具有唯一名稱的字段,以便您可以按要求訪問它們。

但是,說您正在尋找一種無需更改sql查詢即可完成您所要求的方法的方法。 您需要知道結果的順序,特別是如果列表中有多個不明確的名稱,因為您將無法對不明確的字段進行重新排序,MySQL確實會返回所有字段,您所看到的只是數組工作的方式沒有得到你想要的答案。 或者,我的免責聲明,這是我應該退出此MYSQL_FUNCTIONS的原因之一...(我希望如此,因為如果這是一個該死的偉大原因,則mysql_fetch_assoc()應該可以選擇放置一系列結果對於此示例將是['id','name','id','name'])

您沒有說任何有關數據庫的信息,但是說在這個示例中,它們都有兩個列id和name。 每個數據庫的返回結果將是ID,名稱,或者在查詢的情況下將是:ID,名稱,ID,名稱

這是如何運作的? mysql_fetch_array()的結果數組如下所示:

說應用程序數據庫具有值:1,應用程序名稱說類別數據庫具有值:2,類別名稱

Array
(
    [0] => 1
    [id] => 2
    [1] => 'app name'
    [name] => 'category name'
    [2] => 2
    [3] => 'category name'
)

因此,如果您知道結果的順序,則即使它們具有相同的名稱,也可以至少訪問不同的字段。 但是,看上面的簡單示例,很難說[2]是[id]還是[name],但是如果您知道順序...

然后再次選擇*,然后有人更改數據庫...添加一列...

$query = "SELECT app.name as `appname`, categorie.name as `catname`,
                 and_maybe_other_columns_here
          FROM app JOIN categorie ON app.id = categorie.id";

 while ($row = mysql_fetch_array($query)) {
     $categorie = $row['appname']; //is there a way to do this?
     $aplicativo = $row['catname'];
 }

暫無
暫無

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

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