2

私は3つのテーブルを含むデータベースで作業しています:

  1. 企業一覧
  2. 彼らが販売する製品の表
  3. 彼らが各日付に提供した価格の表

特定の日付に特定の製品タイプの最低価格を提供している会社のリストを生成するために、php でこのようなクエリを実行しています。

SELECT
  a.name AS company,
  c.id,
  MIN(c.price) AS apy
FROM `companies` a
JOIN `company_products` b ON b.company_id = a.id
JOIN `product_prices` c ON c.product_id = b.id
WHERE
  b.type = "%s"
  AND c.date = "%s"
GROUP BY a.id
ORDER BY c.price ASC
LIMIT %d, %d

これで必要なデータが得られますが、PHP でページャーを実装するには、その日にその製品を提供している企業の総数を知る必要があります。LIMIT は、最初の数個しか表示されないことを意味します...

SELECT 句を SELECT COUNT(a.id) または SELECT COUNT(DISTINCT(a.id)) に変更しようとしましたが、どちらも私が望むものを与えてくれないようです。カウントクエリで GROUP BY と ORDER BY を削除しようとしましたが、それもうまくいきませんでした。何か案は?

4

2 に答える 2

3

あなたがすべきように私には見えますGROUP BY a.id, c.id-グループ化a.idは、通常、c.idごとa.idにいくつかの を持ち、そのうちの「ランダムな」ものを取得することを意味するだけです。これは基本的な正しさの問題のようです。それを修正したら、イニシャルSELECT COUNT(*) FROMなどで次のクエリが返す行数が確実に得られるはずなので、それに応じてページャーを準備できます。

于 2009-05-10T20:37:20.843 に答える
3

この Web サイトは、少なくともバージョン 4 の時点で、MySQL にこれに対する特別なトリックがあることを示唆しています。

幸いなことに、MySQL 4.0.0 以降では、クエリで SQL_CALC_FOUND_ROWS オプションを使用できます。これにより、MySQL は LIMIT 句を無視して合計行数をカウントするようになります。行数を取得するために 2 つ目のクエリを実行する必要がありますが、これは単純なクエリであり、データを取得したクエリほど複雑ではありません。

使い方はとても簡単です。メインクエリでは、SELECT の直後に SQL_CALC_FOUND_ROWS オプションを追加する必要があり、2 番目のクエリでは FOUND_ROWS() 関数を使用して行の総数を取得する必要があります。クエリは次のようになります。

SELECT SQL_CALC_FOUND_ROWS name, email 
FROM users 
WHERE name LIKE 'a%' 
LIMIT 10;

SELECT FOUND_ROWS();

唯一の制限は、SQL_CALC_FOUND_ROWS は行数をどこにも保存しないため、最初のクエリの直後に 2 番目のクエリを呼び出す必要があることです。

于 2009-05-10T20:47:00.623 に答える