0

まず第一に、私は次のようなことをすることができました:

SELECT * FROM `trades`
WHERE 15003 NOT IN (`slot1`, `slot2`, `slot3`, `slot4`)

そして、これは正しく機能し、これらの列のいずれにも製品「15003」のない行が表示されます。しかし、'15003' または '15004' または '15008' のいずれもクエリに含めたくない場合はどうすればよいでしょうか? 私はこのようにしたい:

SELECT * FROM `trades`
WHERE 15003 NOT IN (`slot1`, `slot2`, `slot3`, `slot4`) AND
15004 NOT IN (`slot1`, `slot2`, `slot3`, `slot4`) AND
15008 NOT IN (`slot1`, `slot2`, `slot3`, `slot4`)

動作しますが、適切ではないと思います...

これを最適化するにはどうすればよいですか?

編集: 各取引には ID と 4 つのスロットがあります。

4

2 に答える 2

1

これは非常に貧弱な設計上の選択であり、このクエリがどれほど難しいかを示しています。それ以外の:

TABLE trades
  slot1 INT
  slot2 INT
  slot3 INT
  slot4 INT

次のように適切に正規化する必要があります。

TABLE trades
  trade_id INT

TABLE trades_slots
  trade_id INT
  slot_id INT

これにより、柔軟性が大幅に向上し、クエリの作成がはるかに簡単になります。

SELECT *
FROM trades t INNER JOIN trades_slots s
  on t.trade_id = s.trade_id
WHERE s.slot_id NOT IN (15003, 15004, ...)
于 2012-10-24T19:38:03.323 に答える
0

次のようなクエリを使用します。

Select *, GROUP_CONCAT(product1,product2,product3,product4) as prods
from Trades
group by ID
having prods not regexp '15003|15004|15008'
于 2012-10-24T19:45:51.753 に答える