使用“AND”运算符的多个条件,并使用MySQL从单个表返回精确匹配的行

select 
  games_exchange.u_exchange_id 
from 
  games_exchange 
where  
  ( games_exchange.game_id IN ('7') 
  AND games_exchange.exchange_type = 1 )
  AND (
  games_exchange.game_id IN ('7') 
  AND games_exchange.exchange_type = 2 )
group by 
  games_exchange.u_exchange_id 
HAVING 
  COUNT( games_exchange.u_exchange_id ) = 2

我上述查询的预期结果是u_exchange_id . 但上面的查询返回null . =>通过使用OR运算符,它返回匹配记录但不完全匹配 .

[表的截图在这里] [2]

回答(2)

2 years ago

试试这个WHERE子句:

where 
  (
    games_exchange.game_id = '7' 
    AND games_exchange.exchange_type = 1
  )
  OR
  (
    games_exchange.game_id = '6' 
    AND games_exchange.exchange_type = 2
  )

您目前所拥有的内容毫无意义,因为它会要求每一行都有相互冲突的值 - 例如exchange_type不能同时在任何给定行中"1"和"2" . 对于game_id也是如此 . 因此,如果你用这样的OR分割子句,它将找到所有存在game_id 7和exchange_type 1的组合的行, OR 有game_id 6和exchange_type 2的组合 .

您必须了解WHERE子句中的所有项都单独应用于每一行,并且仅当该行与WHERE中的所有子句匹配时才返回该行 . 由于您的原始代码包含冲突的指令(正如我已经解释过的),它永远不会返回任何行 - 没有行可以匹配所有子句 .

注:当您只检查一个值时,不需要使用“IN”,所以我已将其删除 .


附:请记住,根据您的示例数据 games_exchange.game_id = '6' 将永远不会匹配任何数据 - 它们都具有ID 8.并检查表中的 game_idint 还是 varchar - 如果它's int then you shouldn' t使用引号,那么 games_exchange.game_id = 7 将是正确的 .

2 years ago

经过大量的研究,我想出了解决问题的方法 . 实际上我正在使用条款以错误的方式使用条件 . The proposed solution for my problem is given in below code

SELECT u_exchange_id FROM games_exchange WHERE game_id IN ( '7' ) AND 
exchange_type = 1 
and u_exchange_id IN (select u_exchange_id from games_exchange WHERE 
game_id 
IN ('7') 
and exchange_type = 2 and u_exchange_id IN (select u_exchange_id from 
games_exchange 
WHERE game_id IN ('8') and exchange_type=2) 
group by games_exchange.u_exchange_id HAVING COUNT( 
games_exchange.u_exchange_id ) = 3
)

注意:我通过在两个部分的游戏ID上使用foreach()实现了这一点,并为每个id添加了动态子查询 .