0

データベースがあり、テーブル PEDIDOC にあるデータを FALTANTE と混合して取得する必要がありますが、一致する FALTANTE がなくても PEDIDOC のすべてのデータが必要なため、左結合を行う必要があります。私はトリプルチェックを行い、すべての情報が正しく入力され、すべてがそこにあります.Select * FROM pedidocを実行するだけで、Excelでフィルタリングすると期待どおりの結果が得られますが、左の結合を行うと、製品が欠落しています.

ここにクエリがあります

SELECT
        `pedidoc`.`fecha`,
        `pedidoc`.`IdPedido`, `pedidoc`.`plaza`, `pedidoc`.`IdProducto`,
        `pedidoc`.`Categoria`,`pedidoc`.`Pedido`,`faltante`.`faltante`
FROM `pedidoc`
        LEFT JOIN `caducidad` ON `pedidoc`.`IdProducto`=`faltante`.`IdProducto`
GROUP BY `pedidoc`.`fecha`, `pedidoc`.`IdProducto`

データベースはこちら

CREATE TABLE Faltante (
    IdProducto DECIMAL(17,0) NOT NULL,
    Plaza VARCHAR(40) NOT NULL,
    Fecha VARCHAR(10) NOT NULL,
    Faltante INT NULL,
    FOREIGN KEY(IdProducto) REFERENCES Producto(IdProducto),
    UNIQUE(IdProducto, Fecha, Plaza)
)Engine=InnoDB;

CREATE TABLE pedidoc (
    IdProducto DECIMAL(17,0) NOT NULL,
    IdPedido VARCHAR(40) NOT NULL,
    Plaza VARCHAR(40) NOT NULL,
    Fecha VARCHAR(10) NOT NULL,
    Categoria VARCHAR(40) NOT NULL,
    Pedido INT NULL,
    FOREIGN KEY(IdProducto) REFERENCES Producto(IdProducto),
    UNIQUE(IdProducto, Fecha, Plaza)
)Engine=InnoDB;

返されるデータは正しい (いくつかのランダム サンプルを取得) ですが、pedidoc のデータの半分以上が欠落しています。

クエリの何が問題になっていますか?

参考までに、テスト マシンと WAMP スタックで Windows 8 を実行しています。

サルドス、グスタボ

編集>「最初の」日に取得したテーブルは次のとおりです。問題は、実際にはプラザごとに 1 日 1 つの製品があるのに、1 日 1 つの製品しか必要としないことです。プラザごとにほぼ同じ 1 つの製品リストがあるはずですが、モンテレイの場合、すべての製品ではなく 2 つしか表示されません。

fecha           IdPedido    plaza   IdProducto  Categoria   Pedido  caducidad
01/01/2012  2589970-20  Mexico  4111    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  7920    Bigdonuts   406 0
01/01/2012  2589970-20  Mexico  7921    Bigdonuts   425 0
01/01/2012  2589970-20  Mexico  7922    Bigdonuts   712 0
01/01/2012  2589970-20  Mexico  7923    Bigdonuts   454 0
01/01/2012  2589970-20  Mexico  7924    Bigdonuts   31  0
01/01/2012  2589970-20  Mexico  7925    Bigdonuts   11  0
01/01/2012  2589970-20  Mexico  7926    Bigdonuts   147 0
01/01/2012  2590100-10  Monterrey   7928    Bigdonuts   128 0
01/01/2012  2590100-10  Monterrey   7929    Bigdonuts   70  0
01/01/2012  2590090-30  Reynosa 7931    Big Donuts  12  0
01/01/2012  2590090-30  Reynosa 7932    Big Donuts  154 0
01/01/2012  2590090-30  Reynosa 7933    Big Donuts  23  0
01/01/2012  2590090-30  Reynosa 7934    Big Donuts  169 0
01/01/2012  2590090-30  Reynosa 7935    Big Donuts  50  0
01/01/2012  2589970-20  Mexico  7936    Bigdonuts   352 0
01/01/2012  2590100-10  Monterrey   7937    Bigdonuts   0   0
01/01/2012  2590090-30  Reynosa 7938    Big Donuts  296 0
01/01/2012  2590090-30  Reynosa 7939    Big Donuts  12  0
01/01/2012  2590080-50  Saltillo    7941    Bigdonuts   64  0
01/01/2012  2590080-50  Saltillo    7942    Bigdonuts   38  0
01/01/2012  2589970-20  Mexico  7944    Bigdonuts   269 0
01/01/2012  2589970-20  Mexico  7945    Bigdonuts   284 0
01/01/2012  2589970-20  Mexico  7946    Bigdonuts   320 0
01/01/2012  2589970-20  Mexico  7954    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  7969    Bigdonuts   334 0
01/01/2012  2589970-20  Mexico  7970    Bigdonuts   246 0
01/01/2012  2589970-20  Mexico  7971    Bigdonuts   39  0
01/01/2012  2589970-20  Mexico  7972    Bigdonuts   327 0
01/01/2012  2589970-20  Mexico  8071    Bigdonuts   0   0
01/01/2012  2590080-50  Saltillo    8112    Bigdonuts   0   0
01/01/2012  2590080-50  Saltillo    8113    Bigdonuts   0   0
01/01/2012  2590080-50  Saltillo    8114    Bigdonuts   0   0
01/01/2012  2590080-50  Saltillo    8115    Bigdonuts   0   0
01/01/2012  2590080-50  Saltillo    8116    Bigdonuts   0   0
01/01/2012  2590080-50  Saltillo    8117    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  8212    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  8453    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  8454    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  8456    Bigdonuts   0   0
01/01/2012  2589970-20  Mexico  8457    Bigdonuts   0   0
01/01/2012  2590100-10  Monterrey   68895   Bigdonuts   0   0
4

2 に答える 2

0

GROUP BY は、行数を減らすためにサポートされています

ORDER BY が必要だと思います

重複レコードを削除したいだけなら、SELECT DISTINCT を使用できます。ここで説明されているように、SELECT キーワードの後に​​ DISTINCT キーワードを追加するだけです: http://www.w3schools.com/sql/sql_distinct.asp

ただし、それがあなたが望むものを与えるかどうかはわかりません。ruakh は、こ​​れが移植性のない拡張機能であることについて正しいです。さらに重要なのは、ruakh の回答の参照に記載されているように、GROUP BY は、各フィールドの値が同じであるすべてのレコードを 1 つのレコードにグループ化します。 GROUP BY。

SELECT で言及されていて GROUP BY で言及されていないフィールドについては、MySQL はそれらのレコードのフィールドの値をランダムに選択します。それらのレコードのすべてがそれらのフィールドに同じ値を持っている場合、どのレコードが選択されても問題ありません。たとえば、上記のサンプル データでは、Categoria は plaza of Mexico の 8 つのレコードの最初のセットすべてで Bigdonuts であるため、Categoria のどの値が選択されても問題ありません。

ただし、Pedido の場合、0、406、425 など、いくつかの異なる値が表示されます。MySQL は、これら 8 つの異なる値のいずれかをランダムに選択します。それがあなたの望むものだとは想像できません。

そのため、一般に、GROUP BY でグループ化されているすべてのレコードのフィールド値が同じであることがわかっている場合を除き、SUM、COUNT などの集計関数のいずれかを使用することをお勧めします: http: //www.w3schools.com/sql/sql_functions.asp

于 2013-08-18T00:20:14.467 に答える
0

変えるだけ

GROUP BY `pedidoc`.`fecha`, `pedidoc`.`IdProducto`

GROUP BY pedidoc.IdProducto, pedidoc.fecha, pedidoc.Plaza

UNIQUEの制約に一致するpedidocため、 のすべての行がpedidoc1 回だけ表示されるようになります。

(注: この変更の有無にかかわらず、クエリは他の DBMS に移植できません。これは、MySQL の特別な動作に依存するためです。MySQL 5.6 リファレンス マニュアルの12.17.3「MySQL 拡張機能」GROUP BY参照してください。問題ないと思います。 ?)

于 2013-08-18T07:17:47.607 に答える