1

同じ構造のいくつかのテーブル (約 20) があり、php スクリプトを使用してそれらを並べ替え、新しいテーブルに挿入しようとしています。列の最も安い20:

テーブル A: ID
名前
価格

表B: ID

価格

表 X: ID
名前
価格

tableResult : ID

格安1 価格1 格安2 価格 2 ... 格安X 価格 X





これまでの私のコードは次のとおりです。

(SELECT id, price, name FROM tableA WHERE id = $id)
UNION
(SELECT id, price, name FROM tableB WHERE id = $id)
ORDER BY price ASC

私は別の解決策を探していましたが、15000行を選択するには時間がかかりすぎるため、別の方法があると思います。更新クエリをまだ探していません。最初に選択を修正する必要があります。

なにか提案を?

編集:より多くのテーブルを使用して、質問を明確にしました

EDIT2:ソリューション

私はついにそれを正しくしました。これは、最も安いものを選択するためのクエリです。各 ID を選択してブラウズします。

(SELECT price AS P1, name, id FROM tableA WHERE id = ?) UNION (SELECT price AS P1, name, id FROM tableB WHERE id = ?) UNION (SELECT price AS P1, name, id FROM tableC WHERE id = ?) ORDER BY P1 ASC

次に、glglgl が提案したように、新しいテーブルに挿入します。

('INSERT INTO table (id, name, Position, price) VALUES (?, ?, ?, ?) ');
4

2 に答える 2

2

テーブルの最終的な構造を制御できる場合:そうしないでください。代わりに、1つのテーブルのみを使用し、それがどの目的を果たすかを示すためのフィールドを追加します。

ターゲットテーブルも適切に構造化されていません。代わりに、

tableResult:
 id
 name
 cheapestorder
 cheapest
 price

これですべてが簡単になります。

したがって、1つの行に次の行を含める代わりに

id=10, name=foo, cheapest1=a, cheapestprice1=10, cheapest2=b, cheapestprice2=13,

あなたはいくつかの行を持っています

id=10, name=foo, cheapestorder=1, cheapest=a, cheapestprice=10
id=10, name=foo, cheapestorder=2, cheapest=b, cheapestprice=13

(このプロセスは、データベース理論では「正規化」と呼ばれます。)

すべての入力テーブルを1つにすると、 dcpのクエリが単純化されます。

SELECT name,
       max(mxprice) mxprice,
       min(mnprice) mnprice
FROM
(
  SELECT name,
       max(price) mxprice,
       min(price) mnprice
    FROM tableABC
    GROUP BY NAME, tbltag
) a
GROUP BY NAME

または多分ただ

SELECT name,
       max(price) mxprice,
       min(price) mnprice
    FROM tableABC
    GROUP BY NAME

于 2012-06-02T10:36:05.943 に答える
2

私はこれを Oracle で行いましたが、構文は MySQL と非常によく似ているはずです (select はまったく変更しなくても機能するはずです)。

CREATE TABLE tableA (NAME VARCHAR2(100), price FLOAT);
CREATE TABLE tableB (NAME VARCHAR2(100), price FLOAT);

INSERT INTO tableA VALUES ('a',14.23);
INSERT INTO tableA VALUES ('b',15.23);
INSERT INTO tableA VALUES ('b',16.23);

INSERT INTO tableB VALUES ('a',12.23);
INSERT INTO tableB VALUES ('a',13.23);
INSERT INTO tableB VALUES ('b',9.23);

SELECT name
     , max(mxprice) mxprice
     , min(mnprice) mnprice
FROM
(
  SELECT name
       , max(price) mxprice
       , min(price) mnprice
    FROM tableA
    GROUP BY NAME
  UNION ALL
  SELECT name
       , max(price) mxprice
       , min(price) mnprice
    FROM tableB
    GROUP BY NAME
) a
GROUP BY NAME

結果:

    NAME    MXPRICE MNPRICE
1   a       14.23   12.23
2   b       16.23   9.23
于 2012-06-01T21:30:52.983 に答える