我有以下三张表:
顾客
id(主键)
名称
产品
id(主键)
名称
价格
交易
id(主键)
客户id(fk ref customer.id)
产品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的产品的列表。我很难弄清楚这一点,因为我使用事务表作为客户和产品之间的连接表,并且我查找每个客户的每个产品的计数的方式是通过记录计数(正如您在上面的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,以及客户未使用的每种产品的价格。
这可能是一个解决方案,但似乎远不实际,因为我要处理两个列表,并且必须以编程方式赋值,而不是处理一个包含我需要的所有数据的列表,这将影响排序等。
我想知道这是否可能,或者是否有其他方法来看待这个问题。
我希望这足够清楚。如果你能深入了解此事,我将不胜感激!
毛里西奥b。
3条答案
按热度按时间mklgxw1f1#
这应该适用于大多数dbms。它将所有客户产品的事务表分组,并获取它们的计数。然后将其与产品连接起来。因为它是一个左连接,所有产品都将包括在内。对于客户尚未使用的产品,将使用联接列
NULL
. 伯爵也是。与coalesce()
函数返回的第一个参数不为null,则这些参数的计数为0,其他参数的实际计数为0。如果您的实际dbms不支持coalesce()
您可能需要将其替换为相应的dbms特定函数。6rvt4ljy2#
您必须执行两个select查询并将它们连接起来:
erhoui1w3#
不要在句子中使用逗号
FROM
条款。始终使用适当的、明确的、标准的JOIN
语法。你的问题是你需要一个
left join
:注意:您不需要customer表。id在事务表中。