2

「LIMIT0、50」、「LIMIT 50、50」、LIMIT .....の順に設定するときに、データベース内の重複を無視したいのですが、テーブルの1列だけで重複をスキャンする必要があります。一度にすべての列ではありません。複製はある意味で異なるため、マージできません。これらの複製の価格は異なります。

より正確には、これらのアイテムのリストを表示する必要がありますが、右側に異なる価格を表示する必要があります。

ページごとに正確な数(50)が必要なので、ロードを少なくして次のページに進むことができません。したがって、重複を無視すると、ページごとに正確に50を取得し、適切な数のページを取得するように、最初からより多くの負荷をかけることができます(遠いページにいる場合は、最大オフセットと前のオフセットを変更します)。最後に表示されます。

私はPHPの初心者ですが、その方法がわかりません。たぶん、すべてのテーブルを事前にスキャンしてから、スキャンのLIMITの変数とすべてに柔軟に対応して、コードの記述を開始しますか?どのような機能が必要ですか?どうやって ?

そうでなければ、事前にプログラムされた何か、またはそれが存在することを私が知らないphpの関数がこの問題を解決することができますか?または私は本当に頭痛の種xDを取得する必要があります

4

3 に答える 3

1

おそらく、アイテムごとにグループ化して、GROUP_CONCATさまざまな価格表を表示するために使用できますか?このようにして、引き続きを使用できますLIMIT 50。価格列が数値の場合は、VCHARにキャストします。

于 2012-07-28T02:34:51.320 に答える
1

私はあなたが何を求めているのか完全にはわかりませんが、これらの行に沿って集計ステートメントを実行することをお勧めします。

select
    itemID,
    group_concat(itemPrice)
from
    yourTable
group by
    itemID
limit 50

これにより、50個のアイテムのリストと、すべての価格がグループ化された2番目の列が返されます。次に、PHPコードで、explode()その2番目の列をそのままにしておくことができます。

編集:すべてのフィールドを選択すると、集計関数を使用できなくなります。変わらない他の列を選択する場合は、次のようにselectセクションとgroupbyセクションの両方に追加します。

select
    itemID,
    itemName,
    itemSomething,
    itemSomethingElse,
    group_concat(itemPrice)
from
    yourTable
group by
    itemID,
    itemName,
    itemSomething,
    itemSomethingElse
limit 50
于 2012-07-28T02:35:07.750 に答える
0

私は他の答えから関数を借りたことを認めgroup_concat()ます:)

ドキュメントからこの段落を読んだ後:

The default behavior for UNION is that duplicate rows are removed from the result.
The optional DISTINCT keyword has no effect other than the default because it also
specifies duplicate-row removal. With the optional ALL keyword, duplicate-row removal
does not occur and the result includes all matching rows from all the SELECT statements.

testdb.test次の表( )を想定します。

ID  Name    Price
1   Item-A  10
2   Item-A  15
3   Item-A  9.5
4   Item-B  5
5   Item-B  4
6   Item-B  4.5
7   Item-C  50
8   Item-C  55
9   Item-C  40

このテーブルの行(9行)またはグループ(アイテムの名前に基づいて3つのグループ)をページングできます。

アイテムグループに基づいてアイテムをページングする場合は、次のようになります。

SELECT 
    name, group_concat(price)
FROM
    testdb.test
GROUP BY name
LIMIT 1 , 3 
UNION SELECT 
    name, group_concat(price)
FROM
    testdb.test
GROUP BY name
LIMIT 0 , 3; -- Constant 0, range is the same as the first limit's

すべてのアイテムに基づいてアイテムをページングしたい場合(私はそれがあなたが求めていたものではないと思いますが、それが他の誰かを助ける場合に備えて)、これは役立つはずです:

SELECT 
    name, price
FROM
    testdb.test
LIMIT 1 , 5 
UNION SELECT 
    name, price
FROM
    testdb.test
LIMIT 0 , 5; -- Constant 0, range is the same as the first limit's

注意すべき非常に重要なことは、制限をどのように変更する必要があるかということです。最初の制限はキーです。<=である限り、任意の制限から開始できますがcount(*)、2番目の制限と同じ範囲である必要があります(つまり3、最初の例と52番目の例)。そして、2番目の制限は常に0示されているように始まります。

私はこれに取り組むことを楽しんだ、これが役立つことを願っている。

于 2012-07-28T03:14:55.347 に答える