0

たとえば、レンタルアイテムを含むテーブルがあります

 id | itemID | state
 3  |      2 |     0
 2  |      2 |     1
 1  |      2 |     1

状態は、アイテムが過去にレンタルされたかどうかを表します。0 = currently rented

アイテムを含むテーブル:

id | item   | condition
1  | showel |      good
2  |    saw |        ok

現在レンタルされていないアイテムを選択したいのですが、最終的には次のようになりました。

SELECT * FROM
(
  SELECT CASE WHEN b.itemID = a.id AND b.state = 0 THEN 1
  ELSE 0 END AS itemState, a.condition AS condition
  FROM items AS a
  LEFT JOIN rented AS b ON a.id = b.item_id
) AS states
WHERE states.itemState = 0

しかし、SQL は saw[id=2] が現在空いていることを返していますが、それは正しくありません。

SQL文を修正する方法はありますか?

// 編集: レンタルされたテーブルに重複する itemID を保持する必要があります

4

1 に答える 1

0

あなたが何を求めているかを正しく理解していれば、次のように達成できます。

SELECT outerA.*
  FROM items AS outerA
    LEFT JOIN (SELECT innerA.*
                 FROM rented AS innerA
                   JOIN (SELECT MAX(id) AS id 
                           FROM rented 
                           GROUP BY itemID) AS innerB
                     ON innerB.id = innerA.id) AS outerB
      ON outerB.itemID = outerA.id
  WHERE outerB.state IS NULL
    OR outerB.state = 1;

レンタルされたことがないアイテム、またはrentedテーブルの最後のエントリが現在レンタルされていないことを示すアイテムを選択します。

この短いデモも参照してください。

于 2013-10-27T13:27:19.433 に答える