使用3表的Mysql查询返回错误的数据

时间:2014-12-16 07:38:25

标签: mysql subquery inner-join

表1 - >访问控制

1) user_uuid
2) product_id
3) facebook_uuid

表2 - >产品表

1) product_id
2) product_name
3) status
4) visibility
5) result
6) user_uuid

表3 - >出价表

1) product_id
2) user_uuid
3) options

示例数据

产品表: -

ID - Name - status - visibility - result  - user_uuid
1  - T1   - 1      -     1      -   0     -    1
2  - T2   - 1      -     1      -   0     -    1
3  - T3   - 0      -     0      -   1     -    1

访问控制

user_uuid    -    product_id    -    facebook_uuid

    1        -        1         -         123
    1        -        1         -         456
    1        -        1         -         789

    1        -        2         -         123
    1        -        2         -         456
    1        -        2         -         789

    1        -        3         -         123
    1        -        3         -         456
    1        -        3         -         789

出价表: - 最初,只要用户对产品出价,此表就不会有任何数据,只会输入此数据。

product_id   -   user_uuid   - options
   1         -      2        -  123.35

用户表: -

user_uuid   -   facebook_uuid
   1        -      007
   2        -      123
   3        -      456
   4        -      789

说明: -

用户1创建了3个产品并与其他Facebook用户共享。为了管理共享,我们创建了访问控制表,我们跟踪用户1与其他用户共享的产品记录。您可以在访问控制表中检查它。

现在,产品与他人共享,因此用户可以在屏幕上看到与他们共享的产品。

我们在屏幕上有两个标签 - >共享&出价。

共享 - >在这里,用户将看到与他们共享的产品,但他们尚未对产品进行出价。一旦用户对任何产品出价,我们就会在上面显示的出价表中输入。

出价 - >在这里,用户将看到他们出价的产品。

我们的查询: -

SELECT * 
FROM PRODUCT TABLE 
WHERE product_id IN 
    ( SELECT product_id 
      from ACCESS TABLE 
      where facebook_uuid ='123' 
        and product_id not in 
           ( Select product_id from BID TABLE) 
    )  
or product_id IN 
    ( SELECT product_id 
      from ACCESS TABLE 
      where user_uuid  IN 
           ( select user_uuid 
             from USER TABLE 
             where facebook_uuid = '123' 
           ) 
       and product_id not in 
           ( Select product_id from BID TABLE )
     ) 
AND result = 0 
AND status = 1 
AND visibility = 1

这应该返回我的产品2,因为用户2已经为产品1和产品3状态&放置了BID。可见性标准不匹配。但上面的查询给了我PRODUCT 2& 3两者都错了。

我们正在使用3表获取数据并寻求专家的帮助来指导。

注意 - 我们必须检查2件我们无法在我们查询中无法做到的事情,用户不得与产品创建者一起向用户出价和共享。

1 个答案:

答案 0 :(得分:1)

第一个子查询选择与给定用户共享的产品,第二个子查询选择给定用户已经出价的产品。因此查询选择产品in第一个列表(由第一个子查询选择),not in第二个列表(由第二个子查询选择)。

select *
from product_table
where
    result=0 and
    status=1 and
    visibility=1 and
    product_id in (
        select product_id            
        from access_table
        where facebook_uuid='123'
    ) and
    product_id not in (
        select product_id
        from
            bid_table join
            user_table on user_table.user_uuid=bid_table.user_uuid
        where facebook_uuid='123'
    )

http://www.sqlfiddle.com/#!2/d59cb/2