php - 无法从 MySQL 查询中获得所需的结果

标签 php mysql sql

我正在尝试在 MySQL 中编写查询并在 PHP 中输​​出,但事实证明这相当困难。

我有一个包含 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 个苹果的篮子。我需要的是一份声明,该声明将只接受确切的产品及其数量以退还这些成分所属的一个篮子,或者什么都不接受。

因此,即使 Fruitbasket1 中有 1 个梨和 2 个苹果,如果客户未指定另一部分,即 5 个葡萄,则结果不应为 Fruitbasket1。

最佳答案

此查询将返回唯一产品为 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

关于php - 无法从 MySQL 查询中获得所需的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25997509/

相关文章:

php - 如何获取字符串的两个字符的开头

php - 如何 : Drupal File Upload Form

mysql - 除了 MySQL 中的所有等效项

mysql - Fast MAX, GROUP BY 多列拼接

php - 如何多次合并同一个数组?

php - 从MySQL表中获取第二大标记

php - Drupal 无法创建新用户,错误 101 或 324

php - 从数据库中选择计数(*)

如果插入失败,SQL Server 存储过程会恢复我的记录

sql - 用 Haskell 表示电路