Php 选择具有特殊条件和总和的多个表的行(类似于:show if)
我试图在一条MySQL语句(在PHP脚本中使用)中找出以下场景: 有一个包含公共物品的商店数据库,向所有人(客户0)显示这些物品。有些客户购买某些商品可以享受特价(折扣)。最后一个选项是,客户A只允许查看库存1中的库存量,客户B允许查看库存1和库存2中的物品量 我的问题是,我想为具有公共文章和特殊客户文章的客户显示文章概述。如果客户A对物品10000有特殊条件,则不显示公共物品,只显示特殊客户物品 客户500需要以下结果:Php 选择具有特殊条件和总和的多个表的行(类似于:show if),php,mysql,sql,Php,Mysql,Sql,我试图在一条MySQL语句(在PHP脚本中使用)中找出以下场景: 有一个包含公共物品的商店数据库,向所有人(客户0)显示这些物品。有些客户购买某些商品可以享受特价(折扣)。最后一个选项是,客户A只允许查看库存1中的库存量,客户B允许查看库存1和库存2中的物品量 我的问题是,我想为具有公共文章和特殊客户文章的客户显示文章概述。如果客户A对物品10000有特殊条件,则不显示公共物品,只显示特殊客户物品 客户500需要以下结果: article_no article_name length width
article_no article_name length width customer_article_no price total_sum
------------------------------------------------------------------------
10000 Article One 10 10 123 13.50 45
20000 Article Two 15 13 1.25 10
30000 Article Three 25 25 456 25.00 35
经过一些尝试,我得到了以下结果(X是不需要的行):
我尝试了几个连接,如:
SELECT a.article_no, a.article_name, a.length, a.width,
atc.customer_article_no, atc.price,
(SELECT SUM(sa.stocked) FROM stocked AS sa WHERE (sa.stock_id = 1 OR sa.stock_id = 2) AND sa.article_no = atc.article_no GROUP BY article_no) AS total_sum
FROM article AS a
JOIN article_to_customer AS atc
ON atc.article_no = a.article_no AND (atc.customer_no = 500 OR atc.customer_no = 0)
SELECT a.article_no, a.article_name, a.length, a.width,
atc.customer_article_no, atc.price,
(SELECT SUM(sa.stocked) FROM stocked AS sa WHERE (sa.stock_id = 1 OR sa.stock_id = 2) AND sa.article_no = atc.article_no GROUP BY article_no) AS total_sum
FROM article AS a
JOIN article_to_customer AS atc
ON atc.article_no = a.article_no AND (atc.customer_no = 500 OR atc.customer_no = 0)
GROUP BY atc.public_article
但我没能得到想要的结果
因此,快速概述中的条件:选择article\u to\u customer表中的所有文章,并合计库存金额。如果有特殊的客户条件(如自己的客户编号或不同的价格),只显示客户文章版本,忽略公共文章
请记住:数据库结构只是一个没有外键和许多数据的最小示例。如果需要,可以更改结构。To应将此类最佳匹配联接拆分为两个联接:
FROM article AS a
LEFT JOIN article_to_customer AS atc1
ON atc1.article_no = a.article_no
AND atc1.customer_no = 500
LEFT JOIN article_to_customer AS atc2
ON atc2.article_no = a.article_no
AND atc2.public_article = 1
然后,您必须为选择列表中act的每一列添加合并:
COALESCE(atc1.customer_article_no, atc2.customer_article_no),
COALESCE(atc1.price, atc2.price)
如果您得到的文章在article\u to\u customer
中不存在,您可能需要添加另一个条件以获得与内部联接相同的结果:
WHERE (atc1.article_no IS NOT NULL OR atc2.article_no IS NOT NULL)
好伙伴!这就是我要找的。coalesce()对我来说是新事物。。我甚至不知道用干净的mysql代码可以实现这样的功能。非常感谢
COALESCE(atc1.customer_article_no, atc2.customer_article_no),
COALESCE(atc1.price, atc2.price)
WHERE (atc1.article_no IS NOT NULL OR atc2.article_no IS NOT NULL)