Mysql INNER JOIN和HAVING COUNT

时间:2014-11-26 15:22:53

标签: mysql

嘿MYSQL问题:

我有3个表,让我们称之为item,article和order_point,看起来像这样(简化形式):

item = |item_id|article_id|,   
article = |article_id|article_info|,  
order_point=|op_id|article_id|op_amount|

items-table包含存储中的物理项目(每个物理项目一行)。文章表包含有关每种物理项目的信息,order_point(金额)表示每篇文章应始终保存在多少中。

现在我要做的是让每个article_id在商店中的商品数量少于order_point_amount。

所以我想要的是这样的:

SELECT article_id 
FROM item INNER JOIN order_point 
ON (item.article_id = order_point.article_id GROUP BY item.article_id 
HAVING COUNT(item)<order_point.op_amount)

上述代码无效,而且是工作日的最后几分钟所以让我们看看有人在明天之前解决了这个问题!

编辑:查询中的问题是,在having子句中不知道order_point.op_amount。

2 个答案:

答案 0 :(得分:0)

假设您正在加入没有重复的列,这是一种非常常见的情况:

A和B的内连接给出了A交叉B的结果,即维恩图交叉的内部。

A和B的外连接给出A联合B的结果,即维恩图联合的外部部分。

实施例

假设您有两个表,每个表都有一个列,数据如下:

A    B
-    -
1    3
2    4
3    5
4    6

注意(1,2)是A独有的,(3,4)是常见的,(5,6)是B独有的。

内部联接

使用任一等效查询的内部联接给出了两个表的交集,即它们共有的两行。

select * from a INNER JOIN b on a.a = b.b;
select a.*,b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

左外连接

左外连接将给出A中的所有行,以及B中的所有公共行。

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*,b.*  from a,b where a.a = b.b(+);

a |  b  
--+-----
1 | null
2 | null
3 |    3
4 |    4

全外连接

完整的外部连接将为您提供A和B的并集,即A中的所有行和B中的所有行。如果A中的某些内容在B中没有相应的数据,那么B部分为空,反之亦然。

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b  
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

我希望这能解决你的问题!祝你有愉快的一天!

答案 1 :(得分:0)

我解决了这个问题:

SELECT *
FROM order_point 
INNER JOIN (SELECT item.article_id, COUNT(*) AS in_store
            FROM item INNER JOIN order_point 
            ON item.article_id = order_point.article_id
            GROUP BY item.article_id) AS TEMP
ON order_point.article_id = TEMP.article_id
WHERE TEMP.in_store<order_point.amount
GROUP BY order_point.article_id

这为我提供的行商店的行数少于请求的金额,这就是我所追求的。