具有多个条件的 SQLite SELECT
Sqlite SELECT with multiple conditions
我必须创建一个包含产品 table 和类别 table 的数据库。
每个产品都有名称、价格、创建日期,并且可能属于多个类别。
类别有一个名称和一个标志,用于指示该类别是私有的还是 public。
然后我必须 select 属于超过 5 public 个类别的所有记录。
我创建了这样的 table:
CREATE TABLE PRODUCTS (
ID_PROD int NOT NULL PRIMARY KEY,
NAME TEXT(255),
PRICE INTEGER,
CREATION_DATE DATE
);
CREATE TABLE CATEGORIES (
ID_CAT INTEGER NOT NULL PRIMARY KEY,
NAME TEXT(255),
PRIVATE INTEGER
);
CREATE TABLE PROD_CAT (
ID INTEGER NOT NULL PRIMARY KEY,
ID_PROD INTEGER,
ID_CAT INTEGER,
FOREIGN KEY (ID_PROD) REFERENCES PRODUCTS(ID_PROD),
FOREIGN KEY (ID_CAT) REFERENCES CATEGORIES(ID_CAT)
)
我已经设法 select 属于 5 个以上类别的所有记录,但我找不到如何添加 public 类别条件...
这是我尝试过的:
这个有效:
SELECT NAME
FROM PRODUCTS
WHERE ID_PROD IN (SELECT ID_PROD FROM PROD_CAT GROUP BY ID_PROD HAVING COUNT(*)>5)
但不是这个:
SELECT PRODUCTS.NAME
FROM PRODUCTS, CATEGORIES
WHERE ID_PROD IN (SELECT ID_PROD FROM PROD_CAT GROUP BY ID_PROD HAVING COUNT(*)>5)
AND CATEGORIES.PRIVATE = 1
任何帮助将不胜感激:)
您需要 PROD_CAT
到 CATEGORIES
的连接:
SELECT NAME
FROM PRODUCTS
WHERE ID_PROD IN (
SELECT pc.ID_PROD
FROM PROD_CAT pc INNER JOIN CATEGORIES c
ON c.ID_CAT = pc.ID_CAT
WHERE c.PRIVATE -- or WHERE NOT c.PRIVATE for public categories
GROUP BY pc.ID_PROD
HAVING COUNT(*) > 5
)
或者,没有运算符 IN
,所有 3 个表的连接:
SELECT p.ID_PROD, p.NAME
FROM PRODUCTS p
INNER JOIN PROD_CAT pc ON pc.ID_PROD = p.ID_PROD
INNER JOIN CATEGORIES c ON c.ID_CAT = pc.ID_CAT
WHERE c.PRIVATE -- or WHERE NOT c.PRIVATE for public categories
GROUP BY p.ID_PROD, p.NAME
HAVING COUNT(*) > 5
因为这看起来像作业,我会给出一个很好的提示。
您的第一个查询 returns 属于超过 5 个类别的产品,使用 COUNT
的子查询。您在第二个查询中添加的限制被添加到顶级 WHERE 子句,而不是子查询。子查询仍然适用于 PROD_CAT
并且仍然 returns 相同的结果,其中可能包括 public 个类别。
我必须创建一个包含产品 table 和类别 table 的数据库。 每个产品都有名称、价格、创建日期,并且可能属于多个类别。 类别有一个名称和一个标志,用于指示该类别是私有的还是 public。 然后我必须 select 属于超过 5 public 个类别的所有记录。
我创建了这样的 table:
CREATE TABLE PRODUCTS (
ID_PROD int NOT NULL PRIMARY KEY,
NAME TEXT(255),
PRICE INTEGER,
CREATION_DATE DATE
);
CREATE TABLE CATEGORIES (
ID_CAT INTEGER NOT NULL PRIMARY KEY,
NAME TEXT(255),
PRIVATE INTEGER
);
CREATE TABLE PROD_CAT (
ID INTEGER NOT NULL PRIMARY KEY,
ID_PROD INTEGER,
ID_CAT INTEGER,
FOREIGN KEY (ID_PROD) REFERENCES PRODUCTS(ID_PROD),
FOREIGN KEY (ID_CAT) REFERENCES CATEGORIES(ID_CAT)
)
我已经设法 select 属于 5 个以上类别的所有记录,但我找不到如何添加 public 类别条件... 这是我尝试过的:
这个有效:
SELECT NAME
FROM PRODUCTS
WHERE ID_PROD IN (SELECT ID_PROD FROM PROD_CAT GROUP BY ID_PROD HAVING COUNT(*)>5)
但不是这个:
SELECT PRODUCTS.NAME
FROM PRODUCTS, CATEGORIES
WHERE ID_PROD IN (SELECT ID_PROD FROM PROD_CAT GROUP BY ID_PROD HAVING COUNT(*)>5)
AND CATEGORIES.PRIVATE = 1
任何帮助将不胜感激:)
您需要 PROD_CAT
到 CATEGORIES
的连接:
SELECT NAME
FROM PRODUCTS
WHERE ID_PROD IN (
SELECT pc.ID_PROD
FROM PROD_CAT pc INNER JOIN CATEGORIES c
ON c.ID_CAT = pc.ID_CAT
WHERE c.PRIVATE -- or WHERE NOT c.PRIVATE for public categories
GROUP BY pc.ID_PROD
HAVING COUNT(*) > 5
)
或者,没有运算符 IN
,所有 3 个表的连接:
SELECT p.ID_PROD, p.NAME
FROM PRODUCTS p
INNER JOIN PROD_CAT pc ON pc.ID_PROD = p.ID_PROD
INNER JOIN CATEGORIES c ON c.ID_CAT = pc.ID_CAT
WHERE c.PRIVATE -- or WHERE NOT c.PRIVATE for public categories
GROUP BY p.ID_PROD, p.NAME
HAVING COUNT(*) > 5
因为这看起来像作业,我会给出一个很好的提示。
您的第一个查询 returns 属于超过 5 个类别的产品,使用 COUNT
的子查询。您在第二个查询中添加的限制被添加到顶级 WHERE 子句,而不是子查询。子查询仍然适用于 PROD_CAT
并且仍然 returns 相同的结果,其中可能包括 public 个类别。