【发布时间】:2018-11-14 06:56:28
【问题描述】:
我有以下三个表:
客户
身份证 (PK)
名字
产品
身份(PK)
名称
价格
交易
身份(PK)
customer_id(FK ref Customer.id)
product_id(FK ref Product.id)
创建日期
我正在运行以下查询,它提供了每位客户使用的产品数量:
SELECT p.id, p.name, Count(p.id), p.price
FROM transaction t, product p, customer c
WHERE p.id = t.product_id
AND c.id = t.customer_id
AND c.id = 1
group by p.price, p.name, p.id
ORDER BY p.name ASC;
这可行,只是它只给我客户使用过的产品及其各自的数量。我想要的是客户未使用的那些产品的计数为 0 的所有产品的列表。我很难弄清楚这一点,因为我使用 Transaction 表作为客户和产品之间的连接表,并且我找到每个客户每个产品的计数的方式是通过记录计数(如您在上面的 SQL 代码中所见)。
我能做到:
SELECT *
FROM product
WHERE product.name NOT IN (SELECT p.name
FROM transaction t, product p, customer c
WHERE p.id = t.product_id
AND c.id = t.customer_id
AND c.id = 1);
然后以某种方式以编程方式将 0 分配给我的结果集中的计数,但我最终会得到两个列表,一个包含产品名称、每个产品的计数以及客户购买的每个产品的价格已使用,另一个列表将包含所有产品名称、计数为 0 以及客户未使用的每种产品的价格。
这可能是一个解决方案,但它似乎远不实用,因为 id 正在处理两个列表并且必须以编程方式分配值而不是处理一个包含我需要的所有数据的列表,这会影响排序等.
我想知道这是否可能,或者是否有其他方法可以解决这个问题。
我希望这已经足够清楚了。我将不胜感激任何对此的见解!
毛里西奥·B.
【问题讨论】:
-
您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签
postgresql、oracle、db2、sql-server、... -
你需要使用`LEFT OUTER JOIN`
-
学习使用
JOIN。它已经存在了 20 多年! -
谢谢大家!我忘了提。我正在使用 MySQL。我的错!