【问题标题】:Mysql query using 3 table returns wrong dataMysql查询使用3表返回错误数据
【发布时间】:2015-02-14 11:23:56
【问题描述】:

表 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 与其他用户共享的产品记录。您可以在访问控制表中查看。

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

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

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

投标 -> 用户将在这里看到他们投标的产品。

我们的查询:-

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 的状态和可见性标准不匹配。但是上面的查询给了我 PRODUCT 2 和 3 都错了。

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

注意 - 我们必须检查 2 件我们无法在查询中做的重要事情,即用户不得出价并由产品创建者与用户共享。

【问题讨论】:

    标签: mysql subquery inner-join


    【解决方案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

    【讨论】:

    • 感谢您的意见,但它不起作用。结果返回空。
    • @Scorpion 我用您的测试数据在SQLFiddle 上测试我的查询,它会根据您的需要返回产品 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2014-02-15
    • 2016-12-16
    • 2014-02-20
    相关资源
    最近更新 更多