[英]Get PHP MySQL PDO column table name as a result of a join
我在加入的不同表中有相同名称的字段。 例如ticket.status
, user.status
和transaction.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.