1

私は昨年、stackoverflowを大幅に使用してきました。これは、優れた貢献者による優れた情報源です。今こそ助けを求める時です。

設定は正常です:Orders、OrderArticles、Articles

昨年の間に販売された記事の合計量を取得したいのですが、ベスト5週間のみです。

WEEK関数とUNIXTIMEを気にしないでください-何とか何とか-私はそれをカバーしています。私の質問は、ストアドプロシージャまたは関数に頼らずに実行できるかどうかです。

各週と記事の要約のサブクエリを作成し、合計の降順で結果を並べ替えています。今-クエリを5に制限するだけです。簡単ですが、ArticleIDで結果をフィルタリングする必要がありますが、サブクエリ内にいるため、外部のArticleIDにアクセスできず、結果に参加する-手遅れです;-)

構文(実際のSQLがないと理解しにくいですよね...?)

SELECT a.ID, [more fields], omg.total
FROM Articles AS a
LEFT JOIN
(
    SELECT weeklytotals.articleID, weeklytotals.total
    FROM
    (
        SELECT SUM(ra.quantity) AS total, ra.articleID AS articleID
        FROM OrderArticles ra
        INNER JOIN Orders r
            ON ra.orderID = r.ID
        WHERE r.timeCreated >= UNIX_TIMESTAMP('2011-06-30')
        GROUP BY ra.articleID, WEEK(FROM_UNIXTIME(r.timeCreated))
        ORDER BY SUM(ra.quantity) DESC
    ) AS weeklytotals
    WHERE omg.articleID = a.ID --<-- THIS IS NOT WORKING BUT NECESSARY!
    LIMIT 0, 5
) AS omg
ON omg.articleID = a.ID
WHERE a.isEnabled = 1 --more WHERE-thingys 

これにより、上位5つの記事が返され、それらが正しい記事に関連付けられます。わーい。

SUM関数(omg-SELECTに入る可能性があります)を省略しました。

わかりますか?何が欲しいのか分かりますか?はい、もちろんです!

よろしくお願いします。

編集:条件が変更されました-これは私の人生を楽にしますが、それでも問題の解決策があるかどうか知りたいです。

4

1 に答える 1

1

omgサブクエリでaテーブルのデータを使用する必要がある場合は、それをSELECTパーツではなくFROMパーツに配置します。mysql ドキュメントの用語を使用して、相関サブクエリの結果を外部結果セットのスカラー オペランドとして表示する必要があります。

SUM例のクエリから を省略しましたが、合計、つまり記事ごとに 1 つの数字のみに関心があることについて書きました。私のアプローチはその合計に依存しており、最高の 5 週間のそれぞれに個別の値が本当に必要な場合は、おそらくうまくいかないでしょう。

SELECT a.ID, [more fields], IFNULL(SUM(
    (
        SELECT SUM(ra.quantity) AS total
        FROM OrderArticles ra
        INNER JOIN Orders r
           ON ra.orderID = r.ID
        WHERE ra.articleID = a.ID -- <-- reference a.ID here
          AND r.timeCreated >= UNIX_TIMESTAMP('2011-06-30')
        GROUP BY WEEK(FROM_UNIXTIME(r.timeCreated))
        ORDER BY SUM(ra.quantity) DESC
        LIMIT 0, 5
    )), 0) AS total
FROM Articles AS a
WHERE a.isEnabled = 1 --more WHERE-thingys 
GROUP BY a.ID

ここでは、パフォーマンスについては何も言いません。サブクエリをこのように配置すると、結果セットのすべての行に対して実行されます。そのため、記事数が多い場合は、実用には遅すぎるかもしれません。しかし、それが起こった場合、ストアド プロシージャまたは同様のトリックがうまくいくとは思えません。

編集: 2レベルの深さでネストされたサブクエリを使用した最初の提案では、最も内側のサブクエリにアクセスして最も外側の列を使用できないことがわかりました。しかし、sqlfiddle でこれをいじってみると、サブクエリの結果を合計に安全に渡すことができるため、1 レベルのネストを回避できることもわかりました。したがって、上記のコード番号は実際には MySQL サーバーによってチェックおよび実行されているため、意図したとおりに機能するはずです。

于 2012-06-26T12:59:57.493 に答える