2

私の MySQL データベースには、'orders' と 'orders_lines' の 2 つのテーブルがあります。Orders には、顧客、注文日などに関する情報が含まれています。Orders_lines には、product_id、価格、数量、税率など、注文された製品に関するデータが含まれています。

現在、特定の製品を含む注文を返す検索ページを作成しています。たとえば、product_id 2 のすべての注文を返したいとします。次のようなクエリを考えました。

SELECT * FROM orders WHERE order_id IN ( SELECT order_id FROM orders_lines WHERE product_id = 2 )

しかし、今朝クエリを実行したとき、ホスティングプロバイダーに電話して MySQL プロセスを終了させる必要がありました。聞いたこともなかったし、理由もわからず、今はかなり必死です。orders テーブルには約 30.000 行、orders_lines テーブルには約 38.000 行が含まれています。

データベースがクラッシュする理由、正しく機能するようにクエリを変更する方法、または特定の製品を含む注文を表示するという私の目標を達成する方法についての提案は大歓迎です!

敬具、

マルティン

4

3 に答える 3

2

JOINクエリは(およびGROUP BY)で書き直すことができます。

SELECT o.* 
FROM orders o
  INNER JOIN order_lines ol
    ON o.order_id = ol.order_id
WHERE ol.product_id = 2
GROUP BY o.order_id

または、できれば-ordersテーブルからの結果のみが必要なため- EXISTS

SELECT * 
FROM orders AS o
WHERE EXISTS  
      ( SELECT * 
        FROM orders_lines AS ol
        WHERE ol.product_id = 2 
          AND ol.order_id = o.order_id
      )

ただし、インデックスを確認しEXPLAIN、サーバーに障害が発生する可能性のあるものを再度実行する前に確認してください。

于 2011-08-29T12:32:11.540 に答える
1

私の知る限り、そのような場合に最適な方法は内部結合 (別名自然結合) です。'WHERE .. IN .. はコストのかかる操作になる傾向があります。

SELECT DISTINCT o.* FROM orders o
INNER JOIN orders_lines ol ON  o.order_id = ol.order_id 
WHERE ol.product_id = 2
于 2011-08-29T11:53:31.297 に答える
1

これが必要かどうかわかりませんが、とにかく試してください:

SELECT DISTINCT o.* FROM orders o
INNER JOIN order_lines ol
ON o.order_id = ol.order_id
WHERE ol.product_id = 2
于 2011-08-29T11:54:36.757 に答える