0

productorder_details、 の3 つのテーブルがありordersます。

ユーザーが購入したすべての製品を表示する 1 つのクエリにそれらを結合したいと考えています。

これが私のコードです:

SELECT products.id AS id,
      products.kode  AS kode,
      products.sub_kode AS sub_kode,
      products.nama AS nama,
      products.barcode AS barcode,
      products.harga AS harga,
      IFNULL(products.keterangan_kemasan, ' ') AS keterangan_kemasan,
      IFNULL(products.keterangan_ukuran ,' ') AS keterangan_ukuran,
      SUM(IFNULL(order_details.jumlah_pesanan_akhir,0)) AS jumlah,
      IFNULL(order_details.jumlah_pesanan_akhir,0) AS jumlah_beli,
      orders.idmember AS member
    FROM products LEFT JOIN (orders,order_details)
    ON (orders.id = order_details.idorder
      AND order_details.product_kode = products.kode
      AND order_details.product_subkode = products.sub_kode)
    WHERE products.nama LIKE '%asdu%'
      AND IFNULL(orders.idmember, 21376) = 21376     
    GROUP BY products.kode, products.sub_kode
    ORDER BY IFNULL(order_details.jumlah_pesanan_akhir,0) DESC,
      products.nama ASC
    LIMIT 30;

何が起こっているかというと、コスチュームを購入したことがない場合、そのアイテムは表示されません. その間、私はそれらを表示したい。

これをクエリから削除すると、

AND IFNULL(orders.idmember, 21376) = 21376     

すべてがうまく表示されます。ただし、他の人の注文履歴が表示されます。

4

2 に答える 2

0

クエリを 1 つに制限する必要性を再考することをお勧めします。お気づきのように、やりたいことを実現するのは難しいです。

2 つまたは 3 つのクエリを使用すると、非常に理解しやすくなります。あなたは今それに取り組んでいますが、1年後に振り返ると、これはおかしなことになるでしょう。また、他の誰かがこれを修正する必要がある場合、彼らは苦労するでしょう.

私のおすすめ:

SELECT * FROM users WHERE id=123
    // With that result:
    SELECT * FROM orders WHERE user_id=$user['id']
        // While this loops:
        SELECT * FROM order_details WHERE orderid=$orders['id']

データベースの場合はさらに高速になる可能性があります。特に大きなテーブルでは、結合が遅くなります。テーブルをロックするため、他のユーザーにとっては遅くなります。そして、GROUP BYどちらも役に立たない

于 2013-10-10T09:53:29.323 に答える