我正在加入的不同表中具有相同名称的字段。例如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文档提到它依赖于驱动程序。
由于
答案 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
键
当然,无论如何我都会坚持使用别名。能够使用关联数组对我来说是一个杀手级的功能。