2014-09-23 2 views
3

Я пытаюсь написать запрос в MySQL с выходом на PHP, но это довольно сложно.Не получается получить желаемый результат из запроса 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, это не должно давать Fruitbasket1 в результате, если другая часть, а именно 5 виноград, не указаны клиентом.

ответ

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

Это заявление не приносит никаких результатов, к сожалению. –

+0

@RudyvanSloten вы можете создать скрипку, которая воспроизводит проблему? – FuzzyTree

+2

+1. @RudyvanSloten: Учитывая данные образца, мы ожидаем, что этот запрос вернет ровно нулевые строки, потому что нет «пакета», который имеет только «2 Apple» и «1 Pear». Чтобы получить этот запрос для возврата строки, нам также нужно добавить: ** 'или (amount = 5 и product = 'Grape')' ** и изменить оба параметра ** '= 2' ** на * * '= 3' **, чтобы получить« матч »' Fruitbasket1'. Я считаю, что запрос, предоставленный FuzzyTree, соответствует спецификации. – spencer7593

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 предоставил более сжатую строку :) –

+0

Да, полностью согласен :) – jas

Смежные вопросы