在不同列中选择没有少量值的行(NOT IN)

时间:2012-10-24 19:08:16

标签: mysql notin

首先,我应该做这样的事情:

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

这是正确的,在任何这些列中都给了我没有产品'15003'的rowes。 但是如果我不想在查询中包含“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个插槽。

2 个答案:

答案 0 :(得分: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, ...)

答案 1 :(得分:0)

使用如下查询:

Select *, GROUP_CONCAT(product1,product2,product3,product4) as prods
from Trades
group by ID
having prods not regexp '15003|15004|15008'