2013-03-14 62 views
4

我在加入的不同表中具有相同名稱的字段。如ticket.status,user.statustransaction.status。目前查詢只返回status作爲連接的結果獲取PHP MySQL PDO列表名稱

我怎樣才能得到表名,以阻止覆蓋類似的字段名稱,所以我可以區分字段之間的區別。

簡單地說:

$data = array($eventId); 
$statement = $this->db->prepare("SELECT * FROM ticket, user, transaction 
         WHERE ticket.eventId = ? 
         AND ticket.userId = user.userId 
         AND ticket.transactionId = transaction.transactionId"); 

$statement->execute($data); 
$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

在我的研究,我發現不斷PDO::ATTR_FETCH_TABLE_NAMES看起來像它可以幫助,但我不知道如何實現(我通過$statement->setAttribute();假設以某種方式)。

我也擔心它不起作用,因爲PHP文檔提到它依賴於驅動程序。

感謝

+0

是否有可能停止使用'SELECT *'而改爲'SELECT ticket.status AS ticket_status,user.status AS user_status,...'? – 2013-03-14 16:46:39

+0

p.s我不是100%確定的,但我認爲在'where'中做什麼而不是'join'會更慢。 – webnoob 2013-03-14 16:52:13

+0

@SeanBright,是的,但我確實嘗試過,並沒有解決問題 – 2013-03-14 17:04:43

回答

3

只需添加新的別名,你的SELECT語句

$statement = $this->db->prepare(" 
    SELECT *, ticket.status AS ticket_status, user.status AS user_status, transaction.status AS transaction_status 
    FROM ticket, user, transaction 
    WHERE ticket.eventId = ? 
    AND ticket.userId = user.userId 
    AND ticket.transactionId = transaction.transactionId 
"); 

然後,你可以做

$rows[0]['user_status']; 
$rows[0]['ticket_status']; 
$rows[0]['transaction_status']; 

如果你真的表現的關注,返回添加的將是更大的所以不是數據量新的別名,您可以選擇每一列,而當你這樣做時,在status列上放置一個別名。

+0

這是真的,現在就試試。 – 2013-03-14 17:05:39

1

爲什麼不改變你的實際加入,而不是:

SELECT 
t.status as ticket_status, u.status as user_status, tr.status as trans_status 
FROM 
ticket as t 
inner join user as u on t.userId = u.userId 
inner join transaction as tr on t.transactionId = tr.transactionId 
where 
t.eventId = ? 

你甚至都不需要使用as something投表,但我覺得它的整潔。

請注意,它的實際上將解決此問題的列轉換,而不是聯接方法。

1

最明顯的評論是「不要這樣做,這就是爲什麼別名存在」。但是仍然有一個很好的潛在問題:MySQL是否發送有關結果集列來自哪裏的信息(表,視圖或計算)?

顯然,它確實,因爲PDOStatement對象有一個名爲getColumnMeta()的實驗方法。我測試,並且如果列來自一個表或視圖

  • 它返回一個關聯數組,其中table

    • 包含源表是如果計算列空字符串

    當然,我會堅持使用別名。能夠使用關聯數組對我來說是一個殺手鐗。