MySQL带有子查询的嵌套选择语句

时间:2019-01-08 14:52:15

标签: mysql sql mariadb

我正在努力进行2小时的数据库查询。 有以下数据库结构: 文章表

+---------------+-------------+
| id            | ordernumber |
+---------------+-------------+
|             1 |        3243 |
|             2 |        3344 |
|             3 |        3423 |
|             4 |        7687 |
+---------------+-------------+

变量表

+----+-----------+-------+-------+
| id | articleId | stock | price |
+----+-----------+-------+-------+
|  1 |         1 |     3 | 10,99 |
|  2 |         1 |     0 | 10,99 |
|  3 |         1 |     1 | 10,99 |
|  4 |         2 |     0 | 11,99 |
|  5 |         2 |     0 | 11,99 |
|  6 |         2 |     1 | 11,99 |
+----+-----------+-------+-------+

我想获得所有文章,其中除了一个变体以外,所有股票都具有0库存。 使用普通的sql语句甚至可能吗?我尝试了一个子查询,但没有成功,因为该子查询首先执行,并且我需要传递外部查询结果集的当前记录中的值。

非常感谢您的帮助。

编辑: 预期结果:

+----+-------------+
| id | ordernumber |
+----+-------------+
|  2 |       3344  |
+----+-------------+

2 个答案:

答案 0 :(得分:1)

可以使用group byhaving完成此操作。

select articleID
from variants
group by articleID
having count(*) - 1 = count(case when stock = 0 then 1 end)

答案 1 :(得分:1)

如果要获取该变体的完整信息:

select v.*
from variants v
where v.stock > 0 and
      not exists (select 1
                  from variants v2
                  where v2.articleID = v.articleID and
                        v2.stock > 0 and
                        v2.id <> v.id
                 );

注意:这假设重复的“ 5”是一个错字,并且id在表中确实是唯一的。