2011-10-24 18 views
3

MySQLクエリで表現する方法:「すべての要素を取得し、N個以上の要素を取得する」。MySql:少なくともN個の要素を取得する

私はよりよく説明しようとします。私は製品リスト(製品、価格、日付、新規)を持っていて、ユーザーにすべての新しい要素を表示したい場合にクエリを作成する方法を知りたいですが、N要素未満(例えば5)最後の項目。以下のようなクエリで考えることができれば:

SELECT * FROM `products` WHERE new='1' ORDER BY date DESC 

が、これは単に、すべての新しい要素と、これを返します。

SELECT * FROM `products` WHERE new='0' ORDER BY date DESC LIMIT 5 

だけで必要な最小の要素を返します。

いくつかの例:

  • テーブルには4つの新しいアイテムが含まれている場合、クエリはテーブルが7つの新しい項目が含まれている場合は、クエリが返す必要があります4つの新しいアイテムや最新の非新アイテム
  • を返す必要がありますただ7つの新しい項目
  • テーブルに1つの新しい項目が含まれている場合、クエリは新しい項目と4つの非新規項目を返します。
+0

どのように 'new'フィールドは' date'フィールドから区別しますか?あなたが日付までに注文して結果を5に制限した場合は、とにかくあなたが探していた結果を得ることはできませんか?結果の5番目の要素が「新規」でない場合でも、それはまだ最新の非新規項目ですか?いいえ。 –

+1

LIMITクエリでは使用できません。制限値は定数または変数でなければなりません。クエリが実行されるときに動的に制限を満たすことはできません。クライアント側のマッサージを行う必要があります。 –

+1

@logan:表示する新しい/古いアイテムが7つあっても、5つのアイテムしか返さないでしょう。 –

答えて

4

2つの結果セットを結合するためにUNIONを使用します。

(
    SELECT * 
    FROM `products` 
    WHERE new = '1' 
) 
UNION 
(
    SELECT * 
    FROM `products` 
    ORDER BY new DESC, date DESC 
    LIMIT 5 
) T1 
ORDER BY new DESC, date DESC 
  • UNIONの最初の部分は、すべての新しいアイテムを返します。
  • UNIONの2番目の部分は、最初の5つの新しい項目を返します。5つ未満の項目がある場合は、すべての新しい項目と最初の5-nの古い項目を返します。
  • UNIONは、結果セット内の重複を削除します。

これは、テーブル内の任意の列または列の組み合わせに一意のキーが定義されていることを前提としています。

+1

これは私が最初に思ったものです。ただし、表示する新しいアイテムが5つ以上ある場合でも、これはわずか5つの結果に制限されます。 – Genzume

+1

新しい問題があっても5つの古い結果が出力されるという問題があります。 – Karolis

+0

@Karolis:いいえ、それは* 5行までしか出力しません。 5つ以上の新しい行がある場合、* no *古い行が返されます。 –

0

私ができることは、UNIONの2つの選択:1)すべての新しいアイテムと2)追加アイテムの最小数です。次に、アプリケーション・ロジックで表示する行を決定します。 SQLはあなたが求めていることをするための構文を提供しません。

EDIT:実際には、おそらくユーザ定義の変数を使用して、これを行うことが可能です。それはおそらくUNIONを行うだけで、(MySQLサーバのための)より少ない仕事であり、それでもやっている。

1

注文もnewすることにより、だけでなく、date

SELECT * FROM `products` ORDER BY new, date DESC 
+1

+1私たちは同じことを考えましたが、限界5を忘れないでください。 – Marvo

+0

@マールボーなぜ限界?それはすべての新しい要素を言いますが、5つ以上の要素はありません。このクエリは、両方の要件を満たします。 –

0
SELECT *, @rownum := @rownum + 1 AS rownum 
FROM products, (SELECT @rownum := 0) AS vars 
ORDER BY new DESC, date DESC 
HAVING rownum <= 5 OR new = 1 
+0

私はこれを試してみましたが、5個未満の新しいアイテムがある場合、5個のアイテムを返すことができません – Ivan

+0

また、NULL値も必要ですか? –

0

select * from products order by new desc, date desc limit 5

これは、 "新しい" の列はそれだけで1または0の値を持っていることを前提としています。

+1

しかし、7つの新しいアイテムがある場合、それは5だけを返します! :) – Ivan

0

擬似コード:

CREATE STOREPROCEDURO 
(
    @howMany INT 
) 

Declare @nNew INT 

Declare @nOld INT 

SET @nNew = (select count(*) from table where new = 1 order by date desc) 

set @nOld = (select count(*) from table where old = 1 order by date desc) 

set @nOld = @howMany - @nNew 

if (@nOld < 0) 
begin 
    @nOld = 0 
end 

(select top (@nNew) * from table where new = 1 order by date desc) 
union 
(select top (@nOld) * from table where new = 0 order by date desc) 
</code> 
関連する問題