【发布时间】:2020-02-04 23:43:54
【问题描述】:
我有一个如下的连接查询:
$direction = $descending ? 'DESC' : 'ASC';
$data = $query->join('accommodation_rooms', 'accommodations.id', '=', 'accommodation_rooms.accommodation_id')
->leftJoin('discounts', 'accommodation_rooms.id', '=', 'discounts.accommodation_room_id')
->select('accommodations.*', 'discounts.*')
// ->groupBy('name')
->orderBy('discounts.amount', 'desc');
return $data;
现在这将为我带来每家酒店与其房间一样多,所以如果一家酒店有 20 间客房,它会带回同一家酒店 20 次,当我分组时我得到
违反完整性约束:1052 组语句中的列“名称”不明确
那么我怎样才能删除重复的酒店并为每个房间只显示 1 个我也不想更改左连接加入。请指教。谢谢
【问题讨论】:
-
为了解决歧义,只需在列前指定表名,如
->groupBy('table.name')(不确定您要使用哪个表,也不知道为什么要使用namevs像id这样更独特的东西,但你明白了) -
你不能也不应该。您将数据库层(查询结果)与表示层(您希望结果在 Web 浏览器中的样子)混合在一起。没有什么可以阻止您更改连接类型,但结果可能会有所不同。如果不是所有房间都有相应的折扣,那么你必须使用外连接。
-
@TimLewis group by 没有聚合函数是没有意义的,结果查询也可能违反 sql 标准。
-
@Shadow 是的,好电话。代码中的其他地方可能存在聚合(
$query被引用但未在当前的 sn-p 中定义),但你是对的。话虽如此,我的评论主要是解决如何处理“模棱两可”的部分。