根据连接表中的计数从一个表中排除记录

时间:2010-01-15 07:07:07

标签: mysql count inner-join

我有两张桌子:优惠券和回复。

优惠券表包括以下字段:

  • VendorID [key]
  • CouponID [key]
  • CouponDescription

“回复”表包含以下字段:

  • RespondentID [key]
  • CouponID [key]
  • (此表中未重复VendorID。)
  • 接受[true / false]
  • 拒绝[true / false]
  • 评级[1至5]

当有人接受优惠券时,他们最终会在“回复”表中对其进行评分。同样,当某人拒绝优惠券时,拒绝会显示在“回复”表中。

从优惠券表中提取可用优惠券列表时,我想排除先前收到被投诉人两次或多次拒绝的供应商。例如,如果RespondentID 3先前拒绝了来自供应商47的两张或更多优惠券,则供应商47的所有优惠券将不再显示给RespondentID 3。

有两件事让像我这样的SQL新手很难。

  1. 第一个是如何编写从特定供应商计算拒绝的子查询和特定受访者计算拒绝的子查询。

  2. 第二个是如何将响应表连接(可以这么说)到Coupons表,以便Responses表的子查询将其结果基于RespondentID(在Responses表中)和VendorID(在Responseses表中,必须根据CouponID(在两个表中)确定。

  3. 感谢您的协助。总是很感激。

3 个答案:

答案 0 :(得分:1)

可能是这样的:

   SELECT * FROM Coupons 
     WHERE VendorId NOT IN (
        SELECT C.VendorId 
          FROM Responses R JOIN Coupons C ON R.CouponId = C.CouponId
          WHERE R.RespondentID = 3 AND R.Rejected = True
          GROUP BY C.VendorId
          HAVING SUM(R.Rejected) > 2
     )

我从来没有使用HAVING而没有在SELECT中包含它,但我认为它可以正常工作。另外,不确定Rejected的数据类型,可能SUM()不起作用。

答案 1 :(得分:0)

好的,这是一个很长的镜头,我不确定这个查询是否真的会运行,但我认为关键是你必须两次包括优惠券表。试试这个(但我认为where不允许这样):

select c.CouponID, c.CouponDescription,
       (select count(r.CouponID)
          from Responses r
         inner join Coupons c2 on c2.CouponID = r.CouponID
         where r.RespondentID = 3
           and r.Rejected = true
           and c2.VendorID = c.VendorID) as countRejections

  from Coupons c
 where countRejections < 2

答案 2 :(得分:0)

这就是我想出来的......

SELECT
   * 
   FROM Coupons C 
   WHERE C.OriginatorID NOT IN (
      SELECT 
         DISTINCT C.OriginatorID 
         FROM Responses R  
         INNER JOIN Coupons C ON C.CouponID = R.CouponID 
         WHERE C.OriginatorID IN  (
            SELECT Originators FROM (
               SELECT C.OriginatorID As Originators, Sum(R.Rejected) AS Rejections 
               FROM Responses R INNER JOIN Coupons C ON C.CouponID = R.CouponID
               WHERE R.RespondentID = 1
               GROUP BY C.OriginatorID
            ) AS RejectionTally 
            WHERE Rejections > 1
         )
   )

它有一个额外的嵌入式SELECT的缺点,但似乎大多数性能命中都发生在我尝试从Coupons表中排除特定的OriginatorID时。例如,手动输入排除,例如......

SELECT * FROM Coupons WHERE OriginatorID <> 10

具有相同的效果。在50行的测试表上,处理时间为.27s,而处理时间为.08s的无约束查询则为。

额外的嵌入是由于我需要一个外部NOT IN的列(即我想要排除的OriginatorID)。这意味着我必须首先创建SUM,然后隔离SUM小于标准(1)的记录,然后排除这些记录。