0
SELECT  
    op.sub_order_id, 
    s.supplier_id, 
    GROUP_CONCAT(opb.box_id SEPARATOR ','),
    op.delivery_country

FROM 
    order_p op
INNER JOIN 
    supplier s ON s.supplier_id = op.supplier_name
LEFT JOIN
    order_boxes opb ON op.sub_order_id = opb.sub_order_id
WHERE
    op.order_active=0
    AND op.ship_date>='2013-01-01'
    AND op.ship_date<='2013-04-24'
ORDER BY op.ship_date DESC

私は結合があまり得意ではないので、ご容赦ください。

order一致するサプライヤーマッピングがテーブルに存在するように、指定された日付範囲の間のテーブルからすべてのデータを選択する必要があるこのクエリがありsupplierます。order_boxesこの情報に加えて、sub_order_id フィールドでリンクされたテーブルにボックスが存在する場合は、ボックスもフェッチする必要があります。

ここで、注文テーブルとサプライヤー テーブルを結合すると、約 1000 レコードの正しいレコード セットが得られますが、ボックス テーブルに追加しようとするとすぐに 1 行しか得られません。これは、box テーブルにレコードが 1 つしかないために発生すると推測していますが、box テーブルとともに order テーブルからすべてのレコードを取得する必要があります。INNER JOINボックス テーブルにマップされている一致するサブオーダーのレコードを 1 つだけ取得するのではなく、左結合を使用すると、 sub_order_idLEFT JOINとボックス テーブルの値に関係なく、日付範囲内の最初のレコードが取得されます。

助けてください。また、さらに情報が必要な場合はお知らせください。

EDIT :以前に完全なものを投稿しなかったことを申し訳ありませんが、問題は GROUP_CONCAT にあると思います。これは、レコードセット全体をグループ化し、ボックス テーブル内のレコードのみをグループ化したい場合に使用する必要があるかもしれません。サブクエリ?

電流出力

179-1  |  2  |  2,4,3 |  Canada

期待される出力

168-1  |  1  |        |  Texas
.....
......
179-1  |  2  |  2,4,3 |  Canada
.....
......
4

2 に答える 2

0
SELECT * FROM
(
  SELECT  * FROM order op INNER JOIN 
  supplier s ON s.supplier_id = op.supplier_name

  WHERE
    op.order_active=0
    AND op.ship_date>='2013-01-01'
    AND op.ship_date<='2013-04-24'
  ORDER BY op.ship_date DESC
) AS a 

LEFT JOIN order_boxes opb ON a.sub_order_id = opb.sub_order_id

これを試して、これが役立つかどうか教えてください。

于 2013-04-04T06:19:23.540 に答える
0

日付を変換してみる

 WHERE
op.order_active=0
AND op.ship_date>=
convert(datetime,cast('2013-01-01' as varchar),101)
AND op.ship_date<=
convert(datetime,cast('2013-04-24' as varchar),101)
                        ORDER BY op.ship_date DESC
于 2013-04-04T06:22:57.140 に答える