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

loading...


-2
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]

loading...

2回答

  • 1

    试试这个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 将是正确的 .


  • 1

    经过大量的研究,我想出了解决问题的方法 . 实际上我正在使用条款以错误的方式使用条件 . 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添加了动态子查询 .

评论

暂时没有评论!