Php 选择具有特殊条件和总和的多个表的行(类似于:show if)

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

我试图在一条MySQL语句(在PHP脚本中使用)中找出以下场景:

有一个包含公共物品的商店数据库,向所有人(客户0)显示这些物品。有些客户购买某些商品可以享受特价(折扣)。最后一个选项是,客户A只允许查看库存1中的库存量,客户B允许查看库存1和库存2中的物品量

我的问题是,我想为具有公共文章和特殊客户文章的客户显示文章概述。如果客户A对物品10000有特殊条件,则不显示公共物品,只显示特殊客户物品

客户500需要以下结果:

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)