【问题标题】:SQL Force Left Join to Print No MatchSQL 强制左连接打印不匹配
【发布时间】:2019-01-19 12:03:34
【问题描述】:

我的查询有问题。我有一堆车,而且有很多类型的车。对于每种类型,用户可以选择一辆车,我将其保存在数据库中。当我想检索数据时遇到了麻烦:

[
  {
    "id_typecar": 1,
    "nom_typecar": "Type17",
    "id_car": 14,
    "id_user": 3,
    "cars": [
      {
        "id_car": 1,
        "nom_car": "775",
        }
      },
      {
        "id_car": 2,
        "nom_car": "048",
      }
    ]
  },
  {
 //Not displayed if user_id != 1 or null -> I want to display that
    "id_typecar": 2,
    "nom_typecar": "Type1",
    "id_car": 13,
    "id_user": 1, //expected output "id_user": null
    "cars": [
      {
        "id_car": 11,
        "nom_car": "123",
      },
      {
        "id_car": 12,
        "nom_car": "456,
      },
      {
        "id_car": 17,
        "nom_car": "789",
      }
]

我的查询:

    return TypeCars::with('cars')
        ->leftJoin('cars_user', 'cars_user.id', '=', 'type_cars.id')
        ->where('cars_user.id' = 1)
        ->orWhereNull('cars_user.id')
        ->get()
        ->toJson();

即使 id_user 还不存在,我也想检索数据,因为我必须显示类型和汽车。我用where "null" or where cars_user.userid = ? 添加了leftJoin 约束,但是如果用户3 选择了一种用户1 没有选择的汽车(因为它不会为null 或userid = 1),它将不再显示汽车。

谢谢!

编辑:

实际输出:

+---------------------------------+
| id_typecar name_typecar id_user |
+---------------------------------+
| 1 Type1Car 14                   |
| 2 Type2Car 13                   |
| 2 Type2Car 13                   |
| 3 Type3Car NULL                 |
+---------------------------------+

预期输出:

+---------------------------------+
| id_typecar name_typecar id_user |
+---------------------------------+
| 1 Type1Car 14                   |
| 1 Type1Car NULL                 | <-- needed for the display
| 2 Type2Car 13                   |
| 2 Type2Car 14                   |
| 3 Type3Car NULL                 |
| 3 Type3Car NULL                 |
+---------------------------------+

如果用户 13 没有为此类型指定任何汽车,则我没有此行,因为用户 14 选择了一辆,所以它不会显示

【问题讨论】:

  • JSON 是否以某种方式代表了当前表中的样本数据?你能发布一个更容易理解的版本(纯文本)
  • 我已经用 ASCII 输出更新了正在发生的事情和预期的事情。这很难解释,如果你不明白,请道歉,我试图尽可能清楚,但这并不容易
  • 你为什么不抱怨 type2car 也没有空行?
  • 我忘了添加它,但实际上其他人也是如此。我正在编辑。有人回答的答案与我需要的非常接近,但不幸的是他删除了它
  • 所以你基本上总是希望每辆车都有一个空行以及显示已预订汽车的非空行?

标签: mysql sql laravel eloquent


【解决方案1】:

根据已删除的答案,我解决了我的问题:

return TypeCars::with('cars')->leftJoin('user_cars', function($join){
    $join->on('user_cars.id', '=', 'type_cars.id');
        $join->on('user_cars.id', '=', DB::raw(1)); 
})
    ->whereNull('user_cars.id')
    ->where('user_cars.id', '=', 1)
    ->get()
    ->toJson();

需要DB::raw 以避免 Eloquent 引用原始值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多