在SQLite的INNER JOIN中使用COUNT(以计算缺少的记录)

时间:2018-08-15 14:54:23

标签: sql sqlite join count

在SQLite中,我有一个名为 Items 的表:

| id | name  |
|----|-------|
|  1 | ..    |
|  2 | ..    |
|  3 | ..    |
|  4 | ..    |
|  5 | ..    |
|  6 | ..    |

每个项目可能都有与之关联的标签。标签存储在另一个表中,并且具有自己的ID。项目和标签的关联存储在名为 Associations

的第三个表中
| itemID | tagID  |
|--------|--------|
|      1 |      1 |
|      1 |      2 |
|      1 |      3 |
|      2 |      1 |
|      3 |      4 |
|      3 |      5 |
|      4 |      5 |

如您所见,项目1具有3个标签,项目2和4具有1个标签,项目3具有2个标签。项目5和6没有标签,因此其ID不会出现在 Associations 表中。

现在,我要检索少于2个标签(包括0个标签)的商品ID。如果只是关于“关联表”,那么任务很简单:

SELECT itemID FROM Associations GROUP BY itemID HAVING COUNT(tagID) < 3;

但是,这不会返回没有标签的商品的ID,因为 Associations 表中没有这些商品的ID。所以我想我必须以某种方式使用JOIN。我尝试过

SELECT id FROM Items INNER JOIN Associations ON Associations.itemID=Items.id GROUP BY itemID HAVING COUNT(Associations.tagID) < 3;

但是,这似乎与上一个查询相同。 感谢您的帮助:)

编辑:答案是将INNER JOIN替换为LEFT JOIN,将GROUP BY itemID替换为GROUP BY Items.id

扩展问题:现在,要告诉秘密,这些标签(除了具有ID之外)分为不同的类别,例如红色,绿色和蓝色(例如,ID为5的红色标签)和ID为5的绿色标签实际上是不同的标签。

| itemID | tagID  |tagType|
|--------|--------|-------|
|      1 |      1 | red   |
|      1 |      2 | red   |
|      1 |      3 | blue  |
|      2 |      1 | green |
|      3 |      4 | blue  |
|      3 |      5 | red   |
|      4 |      5 | blue  |

因此,我需要检索少于N个特定类型标签 的商品的ID。我以为我可以通过添加WHERE子句来使用Yogesh的答案轻松解决此问题:

SELECT i.id AS itemID  
FROM Items i LEFT JOIN 
 Associations a 
 ON a.itemID = i.id
WHERE a.tagType='red'
GROUP BY i.id
HAVING COUNT(a.tagID) < 3;

但是,这再次无法返回根本没有标签的项目,因为它们现在已经被WHERE条件过滤掉了。我想我需要遵循以下原则:

SELECT i.id AS itemID  
FROM Items i LEFT JOIN 
 Associations a 
 ON a.itemID = i.id
GROUP BY i.id
HAVING COUNT(a.tagID WHERE a.tagType='red') < 3;

但这似乎不是有效的声明。帮助再次感谢;我可能会“接受”答案。

2 个答案:

答案 0 :(得分:1)

执行private function creationCompleteHandler(event:FlexEvent):void { TimeUtils.formatLessThanTen(1); // works } 而不是LEFT JOIN

INNER JOIN

答案 1 :(得分:0)

您可以在子查询中计数:

select *
from items i
where 2 >
(
  select count(*)
  from associations a
  where a.itemID = i.id
);

这将使您拥有少于2个关联(即零个或一个)的所有项目。