1

id、customer_id、order_date、およびその他のもので構成される注文テーブルがあるとします。また、item_id、item_name、および price で構成される、人々が注文できるアイテムのテーブルもあります。最後に、order_id を item_id に接続する c というテーブルがあります。

私がやりたいことは、名前で検索した特定のアイテムを含むすべての注文について、注文テーブルからデータを取得することです。

私はこのようなことをすることができますが、5つほどは言うまでもなく、たった2つのアイテムであっても、明らかに悪い解決策です. しかし、それは私が探しているものを示していると思います:

SELECT o.id, customer_id, order_date
FROM orders AS o, c AS c1, items AS i1, c AS c2, item AS i2
WHERE item_name = 'foo' AND c1.item_id = i1.id AND c1.order_id = o.id
AND item_name = 'bar' AND c2.item_id = i2.id AND c2.order_id = o.id

誰かがより速く機能するソリューションを提案できますか? このタイプのクエリは非常に一般的だと思うので、少なくとも 1 つの高速で賢い解決策があると思います。:)

考慮すべきことの 1 つは、item_names が必ずしも一意であるとは限らないことです。つまり、HAVING COUNT(...) > 1 を使用するソリューションは、少なくとも 1 つの 'foo' と 1 つではなく、2 回 'foo' を含む注文を取得します。 'バー'。

編集:

「WHERE item_name IN('foo','bar')」を使用してから回答を削除することを提案した人が何人かいますが、探しているクエリは「foo」と「bar」の両方を含む注文を取得する必要があります。どちらかだけではありません。明示的な結合を使用して上記のサンプル クエリを別の方法で作成する必要がある場合、次のようになると思います。

SELECT o.id, customer_id, order_date
FROM orders AS o
INNER JOIN c AS c1
ON c1.order_id = o.id
INNER JOIN items AS i1
ON i1.id = c1.item_id
INNER JOIN c AS c2
ON c2.order_id = o.id
INNER JOIN items AS i2
ON i2.id = c2.item_id
WHERE i1.item_name = 'foo' 
AND i2.item_name = 'bar'
GROUP BY o.id

(実行にはかなり時間がかかります)

4

1 に答える 1

0

ルディ・ライムバックFTW:

SELECT o.id
FROM (SELECT c.order_id
    FROM items
    INNER JOIN c
    ON c.itemid = items.id
    WHERE items.item_name IN ('foo','bar')
    GROUP BY c.orderid
    HAVING COUNT(DISTINCT item_name) = 2
  ) AS these
INNER JOIN orders
ON orders.id = these.orderid
于 2013-04-10T16:48:55.683 に答える