2013-03-14 90 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

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

    当然,我会坚持使用别名。能够使用关联数组对我来说是一个杀手锏。