2

SQLステートメントでリンクする必要のある3つのテーブルがあります(PHPを使用しています-役立つ場合はMySQLを使用しています)。以下のように、3番目のテーブルのベンダーフィールドが「3」に等しいすべての注文を抽出する必要があります。

orders   -  orders_items - items

order_id -> order_id
            item_id     -> id
                           vendor = '3'

これを行うには、さまざまなWHEREとJOINSで信じる方法がたくさんありますが、以下の私の方法と比較して、最も効率的な方法を求めています。

SELECT
    orders.order_id
FROM
    items, orders
INNER JOIN
    orders_items
ON
    orders.order_id = orders_items.order_id
WHERE
    orders_items.item_id = items.id
AND
    items.vendor = '3'
GROUP BY
    orders.order_id
4

6 に答える 6

2
select o.order_id from orders o inner join orders_items oi on o.order_id = oi.item_id inner join items i on oi.item_id = i.id where i.vendor='3';

節内の結合、サブクエリなど、同じことを行う多くの方法。INDEX時間の条件やメモリの条件などのニーズに応じて、テーブルの列とテーブルを結合するデータの量にも大きく依存します。

于 2012-06-22T10:19:10.117 に答える
2

表記法を使用する,ことは、普遍的に悪い習慣とは見なされていませんが、それに同意するのは今ではかなり少数派だと思います。Oracle(そのユーザーがその構文の最も声高な支持者であるように思われる)でさえ、それを使用しないことを推奨しています。

しかし、ミキシングとANSI-92の構文をサポートする人は誰も知りません。それはただトラブルを求めているだけです。,JOIN

SELECT
  orders.order_id
FROM 
  orders
INNER JOIN
  orders_items
    ON orders.order_id = orders_items.order_id
INNER JOIN
  items
    ON orders_items.item_id = items.id
WHERE
  items.vendor = '3'
GROUP BY
  orders.order_id

SQL Optimiserは、指定したとおりにそれを実行しません。SQLは、SQLOptimiserが適切な結果を出すための計画を導き出すための単なる式です。上記のように記述することで、オプティマイザーは、フィルター処理、結合、並べ替えなどを行うのに最適な順序と見なされるものと、それらを実行するために使用するのに最適なインデックスなどを見つけます。


編集

私は人々がDISTINCT以上をサポートしていることに気づきましたGROUP BY

少し短いですがDISTINCT、速くはなく、制限があります。COUNT(*)たとえば、後で追加することはできませんが、追加することGROUP BYはできます。

要するに、GROUP BYできることは何でもDISTINCTできますが、その逆は当てはまりません。私は非常に些細なコードでしか使用DISTINCTしないので、1行で穴のクエリを取得できます。それでも、コードが開発されて、に戻る必要があるので、後で少し後悔することがよくありGROUP BYます。

于 2012-06-22T10:20:27.180 に答える
0

は必要ありません。重複を削除する必要がGROUP BYある場合は、を作成してください。DISTINCT

SELECT DISTINCT o.order_id
FROM orders o
INNER JOIN orders_items oi ON oi.order_id = o.order_id
INNER JOIN items i ON i.id = oi.items_id
where i.vendor = '3'

また、INNER JOINすべてのテーブルで使用してください:)

于 2012-06-22T10:19:23.827 に答える
0

これは効率的で、機能します::

SELECT
   DISTINCT(orders.order_id)
FROM
    items

INNER JOIN orders_items on (items.id=orders_items.item_id )
inner join orders on (orders.order_id=order_items.order_id)
WHERE
items.vendor = '3'
于 2012-06-22T10:19:33.127 に答える
0
SELECT
   orders.order_id
FROM
   orders o
      INNER JOIN orders_items oi ON o.order_id = oi.order_id
      INNER JOIN items i ON oi.item_id = i.item_id
WHERE
   i.vendor = 3

table1、table2の構文は私が使用したものではありませんが、テーブルを結合としてリストする方が最も効率的であると思います。これが最も受け入れられている方法のようです。

また、フィールドが整数の場合、ベンダー基準にスピーチマークを付ける必要はありません。

于 2012-06-22T10:21:11.783 に答える
0
SELECT O.order_id AS Id
FROM orders O
INNER JOIN orders_items OI
    ON O.order_id = OI.order_id
INNER JOIN items I
    ON OI.item_id = I.id
WHERE I.vendor = '3'
GROUP BY O.order_id
于 2012-06-22T10:29:01.010 に答える