获取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,是的,但我试过了,它并没有解决问题这是真的,现在就试吧。