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

获取PHP MySQL PDO列表名作为联接的结果,php,mysql,pdo,Php,Mysql,Pdo,我要加入的不同表中有同名字段。例如ticket.status,user.status和transaction.status。此时,查询只返回状态 如何获取表名,使类似的字段名不被覆盖,从而区分字段之间的差异 简言之: $data = array($eventId); $statement = $this->db->prepare("SELECT * FROM ticket, user, transaction WHERE ticket

我要加入的不同表中有同名字段。例如
ticket.status
user.status
transaction.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 
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 = ?
您甚至不需要使用
来转换表格,但我发现它更整洁


请注意,实际上解决此问题的是对列的强制转换,而不是join方法。

只需在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'];

如果您真的担心性能,那么返回的数据量将更大,因此您可以选择每一列,而不是添加新的别名,同时在
状态
列上放置别名。

最明显的注释是“不要这样做,这就是别名存在的原因”。但仍然有一个很好的潜在问题:MySQL是否发送有关结果集列的来源(表、视图或计算列)的信息

显然是这样,因为
pdo语句
对象有一个名为的实验方法。我一直在测试,它返回一个关联数组,其中

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

当然,我还是会用化名。能够使用关联数组对我来说是一个致命的功能。

您是否可以停止使用
SELECT*
而改为
SELECT ticket.status作为ticket\u status,user.status作为user\u status,…
?p.s.我不是100%确定,但我认为在
中做你在那里做的事,而不是真正的
加入
会更慢。@SeanBright,是的,但我试过了,它并没有解决问题这是真的,现在就试吧。