2013-04-30 17 views
0

所以这第一个SQL返回零行:为什么会发生这种SQL不是在这两个领域都包含工作

SELECT b.b_id 
FROM `buy` b 
    INNER JOIN `buy_multiples` AS bm 
     ON b.b_id = bm.b_id 
     AND b.buy_status IN (2) 
WHERE bm.`option_type` = 'area_id' 
AND bm.selected_option_key IN (10) 
AND bm.`option_type` = 'bzips' 
AND bm.selected_option_key IN (37027) 
GROUP BY b.b_id 

这第二个SQL回报B_ID 5024和4987:

SELECT b.b_id 
FROM `buy` b 
    INNER JOIN `buy_multiples` AS bm 
     ON b.b_id = bm.b_id 
     AND b.buy_status IN (2) 
WHERE bm.`option_type` = 'bzips' 
AND bm.selected_option_key IN (37027) 
GROUP BY b.b_id 

这第三个SQL回报B_ID 5024和4987和4989:

SELECT b.b_id 
FROM `buy` b 
    INNER JOIN `buy_multiples` AS bm 
     ON b.b_id = bm.b_id 
     AND b.buy_status IN (2) 
WHERE bm.`option_type` = 'area_id' 
AND bm.selected_option_key IN (10) 
GROUP BY b.b_id 

为什么第一个返回零行?

+0

东西看起来不正确的在这里。 5024如何进入查询2和3?它的'option_type'值是什么?你确定你在同一个数据库中运行查询吗? – 2013-04-30 03:17:57

+2

检查此小提琴http://sqlfiddle.com/#!2/1222e/4。你的第一个查询可以正常运行... – Nalaka526 2013-04-30 03:33:37

+0

你是对的。我搞砸了第一个查询。 OR从我的调试中遗留下来。它被认为是一个AND – randy 2013-04-30 12:52:04

回答

1

在第一个查询中,您正在查找的任何记录bm.option_type = 'area_id'
AND bm.option_type = 'bzips'。这将始终返回0结果。你想用:

SELECT b.b_id 
FROM `buy` b 
    INNER JOIN `buy_multiples` AS bm 
     ON b.b_id = bm.b_id 
     AND b.buy_status IN (2) 
WHERE bm.`option_type` = 'area_id' 
AND bm.selected_option_key IN (10) 
OR bm.`option_type` = 'bzips' 
AND bm.selected_option_key IN (37027) 
GROUP BY b.b_id 
+0

ic3b3rg,谢谢 所以我在想()会包含 所以任何想法,如果我想找到哪里 (bm.option_type ='area_id'AND bm.selected_option_key IN(10 )) 和 (bm.option_type = 'bzips' AND bm.selected_option_key IN(37027) 表已经 B_ID,option_type和selected_option_key – randy 2013-04-30 14:21:22

+0

你错过了点...在WHERE子句为每条记录计算。整个子句必须为True才能将结果包含在结果中,对option_type的两个值使用AND没有意义,你基本上说你想查找带有两个存储的option_type值的记录,不可能。 – ic3b3rg 2013-04-30 14:37:39

+0

不幸的我跟着,谢谢你的帮助。 我只是想弄清楚我该如何做到这一点。我认为我设计这张桌子的方式可能有错误。 – randy 2013-04-30 14:43:01

0

或许你这样的事情之后是......

SELECT DISTINCT b.b_id 
    FROM buy b 
    JOIN buy_multiples bm 
    ON bm.b_id = b.b_id 
WHERE b.buy_status IN (2) 
    AND (
     (bm.option_type = 'area_id' AND bm.selected_option_key IN (10)) 
    OR (bm.option_type = 'bzips' AND bm.selected_option_key IN (37027)) 
     ); 
相关问题