2

ここには同様の質問をするスレッドがたくさんあるようですが、問題を解決するのに役立つスレッドはまだ見つかりません。

他の3つの条件が真でなければならない最小値の行を選択するか、変数()を指定して別の条件セットにフォールバックしuc、最高価格を選択しようとしています。

Table: level (sample data)
id  |price  |copies |used   |uc
--------------------------------------
1   |7      |10     |10     |charlie01
2   |17     |10     |8      |charlie01
3   |37     |5      |5      |charlie01
4   |47     |10     |9      |charlie01
7   |5      |15     |9      |charlie02
8   |15     |15     |0      |charlie02
9   |35     |15     |0      |charlie02
10  |45     |15     |0      |charlie02
11  |3      |5      |5      |charlie03
12  |13     |5      |5      |charlie03

結果: 編集された結果-charlie01は2である必要があります

VARIABLE    |RESULTING ROW
--------------------------
charlie01   |2
charlie02   |7
charlie03   |12

###擬似コードを開始:###

がより小さく、より大きく、等しい場合に最も低い 行を選択します。または結果がない場合(つまり、すべてが等しいことを意味します)等しいおよび等しい場合に最も高い価格の行を選択します。priceusedcopiesused0ucVARIABLEusedcopiesusedcopiesucVARIABLE

SELECT * 
FROM level
WHERE

    (
        used < copies
        AND used > 0
        AND uc = *VARIABLE*
    )
 ### OR IF NO RESULTS ###
    (
        used = copies
        AND uc = *VARIABLE*
    )

ORDER BY price ASC
LIMIT 1

###END擬似コード###

これは私が書いたクエリです(uc charlie01例として使用):

SELECT *
FROM (
    SELECT *
    FROM `level` 
    WHERE 
        ((
        `used` < `copies`
        AND `used` > '0'
        )
        OR
        (
        `used` = `copies`
        ))
        AND `uc` = 'charlie01'
        ORDER BY `price` ASC

        ) AS T
ORDER BY `used` ASC
LIMIT 1

3記録があるため、サンプルデータでは機能しませんused = copies。それの訳はused on record 3 < used on record 2 (the row we want, because it has the lowest price)

MAX()が存在し、最後の1時間使用しようとしましたが、成功しなかったため、実際にはどのように機能するのか理解できていないと思います。何があっても列全体の最大値を選択しているようです。 ...?

今、条件などを追加して輪になって回っていますが、なんらかのタイプのことをする必要があると思いますが、JOINどこから始めればいいのかよくわかりません。このクエリについてどう思いますか?

編集:本当に申し訳ありませんが、実際に最低価格を選択しようとしたときに最高価格を言っていることに気づきましたusedcopiesusedcopies

乾杯
チャーリー

4

1 に答える 1

1

あなたがこれでプロダクションコードに取り組んでいるなら、私はより良い答えを待つでしょう、しかしあなたのために働くかもしれないいくつかの興味深いオプション...

SELECT * FROM (
  SELECT *, (used < copies and used > 0) AS copies_avail FROM level
  ORDER BY copies_avail desc, IF(copies_avail, price, -price) ASC
) AS x GROUP BY uc;

(where句でucを指定する場合は、内側のセクションを使用できます)

さらに興味深い(hackish = pと言わないようにする)同様のオプションは

SELECT * FROM (
  SELECT * FROM level 
  ORDER BY IF(used < copies AND used > 0, price, -price + 10000) ASC
) AS x GROUP BY uc;

(10000は、表の予想価格よりもはるかに高い場合)

とにかく...これらの両方の出力が編集した結果と一致すると信じていますが、おそらくパフォーマンスに関しては恐ろしいものです。このようなことで行き詰まった場合は、ファイルソートを回避するために、copys_availクエリの結果をテーブルに格納できますか?

また、used =0およびcopys>0の場合について知りたいのですが、説明から、価格ascまたは価格descグループのどちらでソートする必要があるかを判断できませんでした。これらの例では、価格の説明が付いています。

于 2012-04-19T05:51:37.650 に答える