繁体   English   中英

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

[英]Get PHP MySQL PDO column table name as a result of a join

我在加入的不同表中有相同名称的字段。 例如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文档提到它依赖于驱动程序。

谢谢

只需在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列上添加别名。

为什么不改变你的实际加入:

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使用as something但我发现它更整洁。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM