3

私はこのクエリを使用しようとしています: MySQL SELECT DISTINCT by maximum value

    SELECT 
    p.*
FROM    
      product p
    INNER JOIN
        ( SELECT 
              magazine, MAX(onSale) AS latest
          FROM
              product
          GROUP BY 
              magazine
        ) AS groupedp
      ON  groupedp.magazine = p.magazine
      AND groupedp.latest = p.onSale ;

Symfony2とDQL内。

私は持っています:

$query = $em->createQuery("SELECT p FROM MyBundle:Product p WHERE p.type = 'magazine' AND  p.maglink IS NOT NULL OR (p.type = 'magazine' AND  p.diglink IS NOT NULL) GROUP BY p.magazine ORDER BY p.onSale DESC");

これはオブジェクトで正常に動作し、オブジェクトを出力しますが、正しいものはありませんMAX(onSale)

行うこと:

 $query = $em->createQuery("SELECT p , MAX(p.onSale) FROM MyBundle:Product p WHERE p.type = 'magazine' AND  p.maglink IS NOT NULL OR (p.type = 'magazine' AND  p.diglink IS NOT NULL) GROUP BY p.magazine ORDER BY p.onSale DESC");

非オブジェクトが返されます。

これ:

$query = $em->createQuery("SELECT
            p.*
            FROM
            MyBundle:Product p
            INNER JOIN
            ( SELECT
                    p.magazine, MAX(onSale) AS p.latest
                    FROM
                    MyBundle:Product p
                    GROUP BY
                    p.magazine
            ) AS groupedp
            ON  groupedp.magazine = p.magazine
            AND groupedp.latest = p.onSale ;");

このエラーをスローします:[Semantical Error] line 0、col 127 near'SELECT':Error:Identification Variable(結合パス式で使用されますが、以前は定義されていませんでした。

このSymfony2Doctrineクエリが原因だと思います

各アイテムを販売で並べ替えることができる一方で、マッピングを維持するにはどうすればよいですか?

4

2 に答える 2

1

これを 2 つのクエリに分割することを検討しましたか。

最初: データベース接続に対してクエリを直接実行し、必要な順序で関連する行の ID を返します。これにより、複雑なクエリが DQL から分離されます。

2番目: 前のクエリのID/順序に基づいて、Doctrineを介して行をクエリし、必要な完全なエンティティを取得します。

于 2012-07-25T16:56:20.027 に答える
1

これは暗闇でのショットですが、かなり明白に見えます。2 つのテーブルを同じエイリアスにエイリアスします。したがって、pを使用する場合。結合では、結合前の p の元の定義から作業していると考えられ、結合を p としてエイリアスします。結合のエイリアス (およびそのテーブルへの参照) を変更して、各エイリアスが一意になるようにします。

于 2012-07-31T17:22:54.593 に答える