我根本无法弄清楚我应该如何编写MySQL查询以获得正确的结果。
我有一个包含以下结构的表:
我需要编写一个查询,该查询返回包含以下参数的所有不同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)。
我的目标是让查询仅返回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。
答案 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)