具有多个条件的 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_CATCATEGORIES 的连接:

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 个类别。