@null_object

Как сформировать SQL запрос?

Есть запрос следующего вида
SELECT
  "selections"."id",
  "selections"."name",
  "selections"."wishes",
  "selections"."created_at",
  "selections"."updated_at",
  "statuses"."id",
  "statuses"."name",
  COUNT("tours"."id")
FROM
  "selections"
  INNER JOIN "statuses" ON "selections"."status_id" = "statuses"."id"
  LEFT JOIN "tours" ON "tours"."selection_id" = "selections"."id"
GROUP BY
  "selections"."id",
  "statuses"."id"


В результате его работы и маппинга в ORM получается следующая структур
[
  {
    "id": 1,
    "name": "Test 1",
    "wishes": "Test wish",
    "created_at": "2024-07-03",
    "updated_at": "2024-07-03",
    "status": {
      "id": 1,
      "name": "ok"
    },
    "tours": 1
  },
  {
    "id": 2,
    "name": "Test 2",
    "wishes": "Test wish",
    "created_at": "2025-01-01",
    "updated_at": "2025-01-01",
    "status": {
      "id": 1,
      "name": "ok"
    },
    "tours": 0
  }
]


Еще есть таблицы clients и clients_selections для отношения много-много. Как правильно сделать джойн таблицы clients к selections при таком отношении в этом запросе? Или лучше это сделать отдельным запросом и уже средствами языка соотносить записи?
  • Вопрос задан
  • 484 просмотра
Пригласить эксперта
Ответы на вопрос 1
@MagicMight
no magic quotes
Можно сделать джоин с подзапросом
SELECT <...>
FROM
  "clients"
  LEFT JOIN "clients_selections" ON "clients"."id" = "clients_selections"."client_id"
  LEFT JOIN (
    SELECT
      "selections"."id",
      "selections"."name",
      "selections"."wishes",
      "selections"."created_at",
      "selections"."updated_at",
      "statuses"."id",
      "statuses"."name",
      COUNT("tours"."id")
    FROM
      "selections"
      INNER JOIN "statuses" ON "selections"."status_id" = "statuses"."id"
      LEFT JOIN "tours" ON "tours"."selection_id" = "selections"."id"
    GROUP BY
      "selections"."id",
      "statuses"."id"
  ) AS "selections_full"
  ON "clients_selections"."id" = "selections_full"."id"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы