用部分分组选择

时间:2016-12-13 14:24:15

标签: postgresql symfony doctrine-orm group-by distinct

你好,我这里有这段代码:

public function getConversations($user, $limit, $page)
{
$offset = ($page - 1) * $limit;

$qb = $this->createQueryBuilder('message');
$qb
    ->select('message, partial o.{id}, partial userFrom.{id, username, avatar}, partial userTo.{id, username, avatar}, partial availability.{id, timeFrom}')
    ->leftJoin('message.from', 'userFrom')
    ->leftJoin('message.to', 'userTo')
    ->leftJoin('message.order', 'o')
    ->leftJoin('o.availabilities', 'availability')
    ->where($qb->expr()->orX(
        $qb->expr()->eq('message.from', ':user'),
        $qb->expr()->eq('message.to', ':user')
    ))
    ->setParameter('user', $user)
    ->setFirstResult($offset)
    ->setMaxResults($limit)
    ->addOrderBy('message.created', Criteria::DESC);

return $qb->getQuery()->getArrayResult();
}

我想只获得连接到每个订单的最后一条消息。如果我要订购2条消息,它会给我2行,但我只需要一行(最后一行)。我尝试使用GROUP BY,但效果不佳。它希望我把所有外国的ids分组,然后结果非常糟糕。

结果是:

{
      "id": "813fa986-f89b-411d-8324-727e427cbc01",
      "isRead": false,
      "created": {
        "date": "2016-12-12 18:01:00.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "content": "Hello to you too",
      "contentType": "text",
      "from": {
        "id": "3e1806d6-f47e-48b4-afdb-1081d9555a3f",
        "avatar": "",
        "username": "User two"
      },
      "to": {
        "id": "52ead9fa-b498-400b-967d-b49886ab3118",
        "avatar": "",
        "username": "User one"
      },
      "order": {
        "id": "8349e718-405a-4e88-8155-3896e9a89fdf",
        "availabilities": [
          {
            "id": "9ddc07e0-be3d-453c-b12f-0ee31bfce444",
            "timeFrom": {
              "date": "2016-12-03 12:00:00.000000",
              "timezone_type": 3,
              "timezone": "UTC"
            }
          }
        ]
      }
    },
    {
      "id": "813fa986-f89b-411d-8324-727e427cbc00",
      "isRead": false,
      "created": {
        "date": "2016-12-12 18:00:00.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "content": "Helllooooooo",
      "contentType": "text",
      "from": {
        "id": "52ead9fa-b498-400b-967d-b49886ab3118",
        "avatar": "",
        "username": "User one"
      },
      "to": {
        "id": "3e1806d6-f47e-48b4-afdb-1081d9555a3f",
        "avatar": "",
        "username": "User two"
      },
      "order": {
        "id": "8349e718-405a-4e88-8155-3896e9a89fdf",
        "availabilities": [
          {
            "id": "9ddc07e0-be3d-453c-b12f-0ee31bfce444",
            "timeFrom": {
              "date": "2016-12-03 12:00:00.000000",
              "timezone_type": 3,
              "timezone": "UTC"
            }
          }
        ]
      }

应该是这样的:

{
      "id": "813fa986-f89b-411d-8324-727e427cbc01",
      "isRead": false,
      "created": {
        "date": "2016-12-12 18:01:00.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "content": "Hello to you too",
      "contentType": "text",
      "from": {
        "id": "3e1806d6-f47e-48b4-afdb-1081d9555a3f",
        "avatar": "",
        "username": "User two"
      },
      "to": {
        "id": "52ead9fa-b498-400b-967d-b49886ab3118",
        "avatar": "",
        "username": "User one"
      },
      "order": {
        "id": "8349e718-405a-4e88-8155-3896e9a89fdf",
        "availabilities": [
          {
            "id": "9ddc07e0-be3d-453c-b12f-0ee31bfce444",
            "timeFrom": {
              "date": "2016-12-03 12:00:00.000000",
              "timezone_type": 3,
              "timezone": "UTC"
            }
          }
        ]
      }
    }

0 个答案:

没有答案