0

私は取引でいっぱいのDBを持っており、取引が注目の取引である場合はこれらの取引の1つだけを表示するWebサイトを持っていますが、正しいロジックを取得するのに苦労しています...サイトに表示される取引は必ずです。有効な日付範囲内であることb。データベースに最近追加された取引である

次のクエリを使用することで、これを実行できます。

"SELECT * FROM deals WHERE datestart < now() AND dateend > now() ORDER BY deals.deal_id DESC" 

素晴らしい。ただし、まれに、一度に多数の取引が追加されることがあるため、どの取引を「フィーチャー」するかを指定するために、なんらかのオーバーライドが必要です。ブール値[featured]を追加し、次のクエリをテストしました。

"SELECT * FROM deals WHERE datestart < now() AND dateend > now() ORDER BY deals.featured DESC"

動作しましたが、注目の取引を指定する必要があります。そうしないと、注目の取引がランダムに選択されますか?一方、私はそれをオーバーライドとしてのみ使用したいと思います。

したがって、上記の2つのスクリプトを何らかの方法で組み合わせる必要があります。

何か案は?

みんなありがとう。

4

4 に答える 4

1

boolean 比較を WHERE 句に追加し、結果の数を 1 に制限します。deal_id で並べ替えると、常に同じ結果が返されます。

SELECT *
FROM deals
WHERE datestart < now() AND dateend > now() AND deals.featured IS TRUE
ORDER BY deals.deal_id DESC
LIMIT 1

編集:

WHERE 句にさらに追加する必要がない代替手段を次に示します。

SELECT *
FROM deals
WHERE datestart < now() AND dateend > now()
ORDER BY deals.featured DESC, deals.deal_id DESC
LIMIT 1

ORDER 句の順序は重要です。deal_id が一意である場合、私が推測したように、それらが逆に順序付けられた場合、フィーチャーされたブール値は使用されません。

于 2012-07-24T09:20:27.840 に答える
0

注目の取引を取得するにはfeatured IS TRUEUNION ALL操作を確認してオーバーライドする必要があります。

SELECT *
FROM   deals
WHERE  datestart < Now()
       AND dateend > Now()
       AND featured IS TRUE
ORDER  BY deal_id DESC

UNION ALL

SELECT *
FROM   deals
WHERE  datestart < Now()
       AND dateend > Now()
ORDER  BY deal_id DESC;
于 2012-07-24T09:24:03.780 に答える
0

2 つのクエリを結合したいだけの場合は、where 句を結合するだけです。最初に deal_id で並べ替えます。次に、同じ deal_id を持つクエリが複数ある場合は、それが注目されているかどうかでサブオーダーします。

SELECT *
FROM   deals
WHERE  datestart < Now()
       AND dateend > Now()
ORDER  BY deals.deal_id DESC,
          deals.featured DESC
于 2012-07-24T09:15:51.857 に答える
0

あなたがやろうとしていることは次のことだと思います:

UPDATE deals 
SET featured=1 
WHERE datestart < now() AND dateend > now()
ORDER BY deal_id DESC
LIMIT 1;

では、最新の有効な注目の取引を更新して、注目としてマークしようとしています。影響を受けた行数が 0 の場合、最新の有効な注目の取引が既に存在するか、テーブルに有効な取引がまったくありません (これにどのように反応するかはあなたの選択です)。

影響を受ける行数が 1 の場合は、新しい行が見つかったので、それを選択する必要があります (おそらく、サイトに入力する必要があります)。選択ステートメント:

SELECT *
FROM deals
WHERE datestart < now() AND dateend > now() AND featured=1
ORDER BY deal_id DESC
LIMIT 1;

理想的には、これら 2 つのクエリを 1 つの update-select に結合するのが理想的ですが、その時点でそれを行う方法はありません。

于 2012-07-24T09:27:04.573 に答える