在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;
但这似乎不是有效的声明。帮助再次感谢;我可能会“接受”答案。
答案 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个关联(即零个或一个)的所有项目。