作为连接的结果获取PHP MySQL PDO列表名

时间:2013-03-14 16:44:29

标签: php mysql pdo

我正在加入的不同表中具有相同名称的字段。例如ticket.statususer.statustransaction.status。目前查询只返回status

如何以这样的方式获取表名,使其停止覆盖类似的字段名称,这样我就可以区分字段。

简单地说:

$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文档提到它依赖于驱动程序。

由于

3 个答案:

答案 0 :(得分: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列上添加别名。

答案 1 :(得分: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转换表格,但我发现它更整洁。

注意,它是实际修复此问题的列的转换,而不是连接方法。

答案 2 :(得分:1)

最明显的评论是“不要这样做,这就是为什么存在别名”。但是仍有一个很好的基本问题:MySQL是否发送了关于结果集列来自哪里(表,视图或计算)的信息?

显然,确实如此,因为PDOStatement对象有一个名为getColumnMeta()的实验方法。我一直在测试,它返回一个关联数组,其中table

  • 包含源表,如果列来自表或视图
  • 如果计算列,
  • 是空字符串

当然,无论如何我都会坚持使用别名。能够使用关联数组对我来说是一个杀手级的功能。