【问题标题】:how to delete duplicate results of a join in laravel如何删除laravel中加入的重复结果
【发布时间】: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')(不确定您要使用哪个表,也不知道为什么要使用name vs像id 这样更独特的东西,但你明白了)
  • 你不能也不应该。您将数据库层(查询结果)与表示层(您希望结果在 Web 浏览器中的样子)混合在一起。没有什么可以阻止您更改连接类型,但结果可能会有所不同。如果不是所有房间都有相应的折扣,那么你必须使用外连接。
  • @TimLewis group by 没有聚合函数是没有意义的,结果查询也可能违反 sql 标准。
  • @Shadow 是的,好电话。代码中的其他地方可能存在聚合($query 被引用但未在当前的 sn-p 中定义),但你是对的。话虽如此,我的评论主要是解决如何处理“模棱两可”的部分。

标签: php mysql laravel


【解决方案1】:

您应该在 Join 查询中指定列来自哪个表

->groupBy('accommodation_rooms.name')

或者

->groupBy('discounts.name')

为了消除重复,您应该附加 distinct 语句

【讨论】:

  • 没有聚合函数的分组是没有意义的,结果查询也可能违反 sql 标准。
  • @Salim Djerbouch,请问 groupBy 和 distinct 有什么区别?
猜你喜欢
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 2021-07-03
  • 2017-04-25
  • 2015-12-06
  • 1970-01-01
  • 2020-04-19
  • 2014-08-02
相关资源
最近更新 更多