2017-09-01 74 views
0

我有像下面结果上,其中条件对同一列与另一列

bundle_id asset_id price_id 
1   2  1 
1   1  1 
1   4  1 
2   2  1 
2   3  1 
3   2  1 
3   1  1 

一个表,我需要使用关于同一列asset_idAND操作以获取的bundle_id = 1的结果。

我正在尝试下面的查询,他们都没有工作。

SELECT bundle_id 
FROM mac.bundle_prices 
WHERE asset_id =2 and asset_id=1 and asset_id =4 and price_id =1 
GROUP BY bundle_id 

SELECT bundle_id 
FROM mac.bundle_prices 
WHERE asset_id IN ('2', '1','4') and price_id =1 
GROUP BY bundle_id 

请提出任何建议!

+1

你的第一个查询总是给你空的结果。但第二个查询有什么问题? –

+0

'asset_id = 2 and asset_id = 1 and asset_id = 4'某物不能一次全部为这三个:) – Scuzzy

+0

@ B.Desai:第二个查询给出所有三个bundle_id。我不想要?我想获得正确的bundle_id,它具有asset_id – 06011991

回答

0

,你可以使用具有用于检查所有ASSET_ID比赛

select bundle_id 
from mac.bundle_prices 
WHERE asset_id IN (2, 1,4) 
group by bundle_id 
having count(distinct asset_id) = 3 

我asssumed是ASSET_ID类型是一些采用ASSET_ID如果你想bundle_ID的2

你应该使用

select bundle_id 
from mac.bundle_prices 
WHERE asset_id IN (2, 3) 
group by bundle_id 
having count(distinct asset_id) = 2 
+0

是asset_id类型是数字 – 06011991

+0

您提到有数量。没有这个是不可能的?因为我想使用相同的查询来获取所有其他bundle_id的不同,其中asset_id组合 – 06011991

+0

基于asset_id,您必须知道这些数目以确保所有匹配。此外,您还必须指出IN子句..那么你应该知道这个计数值 – scaisEdge

0

你可以用这个sql

SELECT bundle_id 
FROM mac.bundle_prices 
WHERE asset_id IN ('2', '1','4') and price_id =1 
GROUP BY asset_id 
+0

此查询给出肯定的错误 – 06011991

+0

您确定@ 06011991?检查此截图http://prntscr.com/gfsedj –

+0

但它给了我错误 – 06011991

0

从您的意见,我认为你需要bundle_id其中与asset_id相同。请尝试以下查询

SELECT bundle_id 
FROM mac.bundle_prices 
WHERE asset_id IN (2, 1,4) and price_id =1 AND asset_id = bundle_id 
GROUP BY bundle_id 
0

英语是一团糟。在英语中,“和”可以表示“或”。但是在任何数学或计算机领域,它的确不是而是

asset_id IN (2, 1, 4)意味着asset_id = 2 OR asset_id = 1 OR asset_id = 4asset_id = 2 and asset_id = 1 and asset_id = 4。想想看。 asset_id只有一个值;它不能同时为=2=1。但它可以是“2”“1”。

另一方面,也许你会问:“是否有3行与不同的asset_id值?具体来说,与2,1,4。”

所以,我们需要找到所有与price_id =1行,然后看看发现了什么asset_id值。有两种方法...

SELECT bundle_id, 
     GROUP_CONCAT(asset_id ORDER BY asset_id) AS list 
    FROM bundle_prices 
    WHERE price_id = 1 
    GROUP BY bundle_id 
    HAVING list = "1,2,4"; -- (this order matters) 

但是这有一个潜在的缺陷。如果有第四排,asset_id = 7?这是很容易解决:

SELECT bundle_id, 
     GROUP_CONCAT(asset_id ORDER BY asset_id) AS list 
    FROM bundle_prices 
    WHERE price_id = 1 
     AND asset_id IN (2,1,4) -- (this order does not matter) 
    GROUP BY bundle_id 
    HAVING list = "1,2,4"; 

另一种方法也使用HAVING,但以不同的方式:

SELECT bundle_id 
    FROM bundle_prices 
    WHERE price_id = 1 
     AND asset_id IN (2,1,4) 
    GROUP BY bundle_id 
    HAVING COUNT(*) = 3 -- exactly all 3 values 

这个技术有回答“的优势,这bundle_ID的具有至少2(2, 1,4)“,将最后一行改为HAVING COUNT(*) >= 2

相关问题