2017-10-04 64 views
1

我需要一些帮助查询来分组一些行,我试着整天找不到解决方案,我相信这很容易。也许有人可以给我带来光在黑暗中:MySQL结果由两个值组

我的表:

> id | Bid | Cid | value 
>  4 | 22 | 11 | 33 
>  5 | 24 | 11 | 33 
>  6 | 25 | 11 | 33 
>  7 | 24 | 11 | 100 
>  8 | 25 | 16 | 150 

我只想要结果买入= 25,如果我有熙11,16值33,150

我试图

SELECT id, Bid FROM `table` WHERE Cid IN (11, 16) AND 
value IN('33','150') GROUP BY Bid; 

但在这案例我得到所有可能的Cid的...

看来我在木材的方式。

+0

你要检查,如果出价既有(CID,值)对(11,33)和(16,150 )? – GurV

+0

是的,确切地说两者都需要匹配 – Korty

+0

Hi @Korty您好,为什么您要在输出中单独出价= 25?如果你可以指定你试图带来的这个查询的关系,那会很有帮助。并且groupby没有工作,因为它会将具有相同Bid值的所有行整合到输出中的单个行中。 –

回答

3

您所查询的是棘手的,因为你正在寻找是否存在给定组中的列值对。一种方法是首先通过Bid,Cidvalue进行聚合,首先限制每个记录具有匹配的对。然后通过Bid子查询,并检查计数为2,表明两个对都存在。

SELECT Bid 
FROM 
(
    SELECT Bid, Cid, value 
    FROM yourTable 
    WHERE (Cid, value) IN ((11, 33), (16, 150)) 
    GROUP BY Bid, Cid, value 
) t 
GROUP BY Bid 
HAVING COUNT(*) = 2; 

演示在这里:

Rextester

更新:

由于您使用的SQL Server,我们可以稍微上面的查询重构这样:

SELECT Bid 
FROM 
(
    SELECT Bid, Cid, value 
    FROM yourTable 
    WHERE (Cid = 11 AND value = 33) OR (Cid = 16 AND value = 150) 
    GROUP BY Bid, Cid, value 
) t 
GROUP BY Bid 
HAVING COUNT(*) = 2; 

这里是查询的SQL Server版本演示:

Rextester

+0

在你的例子中,它的工作原理!但如果我把它1:1(我证明!!)我得到一个错误:近','一个非布尔表达式是在一个条件预期的上下文中指定的。 – Korty

+0

@Korty给出的两个答案在各自的演示中都没有错误地运行。我认为问题就在你身上。如果我的演示失败了某些数据,然后叉我的Rextester并显示我的问题。 –

+0

真的吗?这是我们现在鼓励的那种事情吗? :-( – Strawberry

1

当结合使用GROUP BY一些SUM可以找到答案

SELECT 
Bid 
FROM 
Table1 
GROUP BY 
Bid 
HAVING 
    SUM(Cid = 11) AND SUM(Cid = 16) 
AND 
    SUM(value = 33) AND SUM(value = 150) 

结果

| Bid | 
|-----| 
| 25 | 

演示http://www.sqlfiddle.com/#!9/ce56e97/2

+0

它在你的例子中工作,但我得到以下错误:错误语法靠近')'。我更准时地证明了它 - phpMyAdmin的特色? – Korty

+0

我发现我的错误,昨天已经太晚了,我使用MS SQL不是MySQL,所以它似乎语法错误是我的问题。你有这方面的经验吗? http://www.sqlfiddle.com/#!6/fad5c/3 – Korty