MySQL查询 - 无法确定如何编写特定查询

时间:2015-10-13 19:14:26

标签: mysql

我根本无法弄清楚我应该如何编写MySQL查询以获得正确的结果。

我有一个包含以下结构的表:

enter image description here

我需要编写一个查询,该查询返回包含以下参数的所有不同ronumbers的总计数:

1)必须有serviceID 1

2)还必须有serviceID大于1

3)serviceID大于1必须全部有一个decsvc为1

4)如果#3不是decsvc为1,则该ronumber被取消资格

简单来说,返回serviceID为1且serviceID(s)大于1且仅被拒绝服务(decsvc = 1)的所有不同ronumbers的计数。

我尝试了以下查询:

1)

$query = "SELECT a.ronumber FROM servicerendered_welr a LEFT JOIN
servicerendered_welr b ON (a.ronumber = b.ronumber) 
WHERE a.serviceID > 1 AND a.decsvc = 1 AND a.addsvc = 0 AND a.dealerID = 
$dealerID 
AND b.serviceID = 1 GROUP BY a.ronumber";

2)

$query = "SELECT ronumber FROM servicerendered_welr 
WHERE addsvc = 0 AND dealerID = $dealerID AND ronumber IN 
(SELECT ronumber FROM servicerendered_welr WHERE decsvc = 1 AND dealerID =
$dealerID AND ronumber IN 
(SELECT ronumber FROM servicerendered_welr WHERE serviceID > 1 AND dealerID
= $dealerID AND ronumber IN
(SELECT ronumber FROM servicerendered_welr WHERE serviceID = 1 and dealerID
= $dealerID) 
GROUP BY ronumber) 
GROUP BY ronumber)
GROUP BY ronumber";

这两个都返回相同的结果集。结果返回ronumber(s)12和16(see servicerendered_welr table)。

enter image description here

我的目标是让查询仅返回ronumber 12,与上述规定有关。正如您所看到的,ronumber 16确实符合某些资格,但是serviceID大于1且有decsvc = 0,这是不可接受的。

很明显,查询返回ANYTHING,serviceID为1,serviceID大于1,至少有一个serviceID大于1,{{ 1}}(因此它不排除其他decsvc = 1项目。)

也许我需要深入研究虚拟表?

请在此处查看我的sqlfiddle:http://sqlfiddle.com/#!9/5e45c/3

4 个答案:

答案 0 :(得分:0)

你的问题有点难以理解,但我想我得到了你想做的事。有一个链接到你没有包含的表但我已从查询中删除它,因为它只是WHERE条件的一部分。应该适合您的是:

SELECT

a.ronumber

FROM servicerendered_welr a WHERE 

serviceId = 1
AND
(SELECT COUNT(*) FROM servicerendered_welr b WHERE b.serviceId > 1 AND b.decsvc = 1 AND b.ronumber = a.ronumber) =
(SELECT COUNT(*) FROM servicerendered_welr c WHERE c.serviceId > 1 AND c.ronumber = a.ronumber)

答案 1 :(得分:0)

b

子查询ronumbers找到符合条件2-4的所有 var tweets = await (from tweet in twitterCtx.Status where tweet.Type == StatusType.User && tweet.UserID == twitterUserId select tweet) .ToListAsync(); 。然后我们将它与符合条件1的行连接起来,并计算它们。

答案 2 :(得分:0)

一组数据仅包含服务ID为1的记录 B组数据仅包含服务ID不为1的记录,A组具有B.descsvc,descsvc为1的所有记录(平均3条记录,1条为1)1。

SELECT count(distinct A.RoNumber)
FROM ServiceRendered_welr A
LEFT JOIN (SELECT roNumber, avg(descsvc) avgDescsvc 
           FROM ServiceRendered_welr 
           GROUP BY roNumber
           HAVING avgDescsvc = 1) b 
 on A.RoNumber = B.RoNumber
and A.ServiceID = 1
and B.ServiceID > 1

答案 3 :(得分:0)

我正在为混音添加另一个解决方案,一个没有分组和有。我会在子查询中使用EXISTS子句。您基本上需要具有serviceid = 1并且至少存在1条记录的ronumber,其中serviceid> 1和decsvc = 1并且不存在任何记录,其中serviceid> 1和decsvc<> 1:

select count(distinct s1.ronumber) from servicerendered_welr s1
where s1.serviceid=1
and exists (select 1 from servicerendered_welr s2 where s2.ronumber=s1.ronumber and s2.serviceid> 1 and s2.decsvc=1)
and not exists (select 1 from servicerendered_welr s3 where s3.ronumber=s1.ronumber and s3.serviceid> 1 and s3.decsvc=0)