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 回答