2014-09-23 78 views
3

我想在PHP中使用输出在MySQL中编写查询,但它证明相当困难。无法从MySQL查询中获得期望的结果

我有3列的表(是的,我知道这个数据库布局是不是最好的,但我不能改变这一点,客户有使用此数据库与此完全相同的布局等软件)

Amount - Product - Package 
2  - Apple - Fruitbasket1 
1  - Pear - Fruitbasket1 
5  - Grape - Fruitbasket1 
2  - Apple - Fruitbasket2 
1  - Pear - Fruitbasket2 
9  - Banana - Fruitbasket2 

到目前为止,我想出了这一点:

SELECT package 
FROM `data` 
WHERE package IN 
(
    SELECT package 
    FROM `data` 
    WHERE product = 'apple' AND amount = '2' 
) 
AND package IN 
(
    SELECT package 
    FROM `data` 
    WHERE product = 'pear' AND amount ='1' 
) 
AND package IN 
(
    SELECT package 
    FROM `data` 
    WHERE product = 'grape' AND amount = '5' 
) 
LIMIT 0,1 

的问题是,当客户将填写“苹果”和“2”的形式,它会返回一个包含2个苹果的所有篮子。我需要的是一份声明,它只接受确切的产品和金额,以返还那些成分所属的篮子,或者根本没有。

即使1个梨和2个苹果在Fruitbasket1中,但如果其他部分(即5个葡萄)未被客户指定,它也不应该给Fruitbasket1。

回答

2

此查询将返回所有的包,唯一的产品是2个苹果

select package from `data` 
group by package 
having count(case when amount = 2 and product = 'Apple' then 1 end) = 1 
and count(*) = 1 
如果你想梨1个和2个苹果例如

select package from `data` 
group by package 
having count(
    case 
    when (amount = 2 and product = 'Apple') or (amount = 1 and product = 'Pear') 
    then 1 
    end) = 2 
and count(*) = 2 

,你也可以这样写

select package from `data` 
group by package 
having count(case when amount = 2 and product = 'Apple' then 1 end) = 1 
    and count(case when amount = 1 and product = 'Pear' then 1 end) = 1 
    and count(*) = 2 
+0

这个声明不会产生任何结果,悲哀。 – 2014-09-23 14:38:52

+0

@RudyvanSloten你可以创建一个重现问题的小提琴吗? – FuzzyTree 2014-09-23 14:42:30

+2

+1。 @RudyvanSloten:给出样本数据,我们希望这个查询返回0行,因为没有'package'只有'2 Apple''和''1 Pear''。为了让这个查询返回一行,我们还需要添加:**或(amount = 5和product ='Grape')**,并将**'= 2 ** **改为* *'= 3' **使它与“Fruitbasket1”匹配。我相信FuzzyTree提供的查询符合规范。 – spencer7593 2014-09-23 14:46:42

2

我只有Oracle方便,所以你可能需要调整一些语法,但后续g您的原始风格我已添加“不在”部分,以确保篮子只包含您正在寻找的水果。这里有一些插入几个例子:

create table data (amount integer, product varchar(12), package varchar(16)); 

insert into data values (2, 'Apple', 'Fruitbasket1'); 
insert into data values (1, 'Pear', 'Fruitbasket1'); 
insert into data values (5, 'Grape', 'Fruitbasket1'); 
insert into data values (2, 'Apple', 'Fruitbasket2'); 
insert into data values (1, 'Pear', 'Fruitbasket2'); 
insert into data values (9, 'Banana', 'Fruitbasket2'); 
insert into data values (2, 'Apple', 'Fruitbasket3'); 
insert into data values (2, 'Apple', 'Fruitbasket4'); 
insert into data values (1, 'Pear', 'Fruitbasket4'); 


SELECT package 
FROM data 
WHERE package IN 
(
    SELECT package 
    from data 
    WHERE product = 'Apple' AND amount = '2' 
) 
and package not in 
(
    SELECT package 
    from data 
    WHERE product <> 'Apple' 
) 
group by package 
; 


SELECT package 
FROM data 
WHERE package IN 
(
    SELECT package 
    from data 
    WHERE product = 'Apple' AND amount = '2' 
) 
AND package IN 
(
    SELECT package 
    FROM data 
    WHERE product = 'Pear' AND amount ='1' 
) 
and package not in 
(
    SELECT package 
    from data 
    WHERE product <> 'Apple' and product <> 'Pear' 
) 
group by package 
; 
+0

我会给你一个去,但FuzzyTree提供了一个更简洁的线:) – 2014-09-23 15:01:10

+0

是的,完全同意:) – jas 2014-09-23 15:05:10