PHP:查找订单中包含的所有产品
我想通知用户他们选择的所有产品是否都可用。我创建了一个mysql表,其中包含以下信息:PHP:查找订单中包含的所有产品,php,mysql,Php,Mysql,我想通知用户他们选择的所有产品是否都可用。我创建了一个mysql表,其中包含以下信息: +--------+-------------+------+-----+ | id | order_id | pro | avai| +--------+-------------+------+-----+ | 1 | 28 | NO1 | y | | 2 | 28 | NO2 | y | | 3 | 28
+--------+-------------+------+-----+
| id | order_id | pro | avai|
+--------+-------------+------+-----+
| 1 | 28 | NO1 | y |
| 2 | 28 | NO2 | y |
| 3 | 28 | NO4 | n |
| 4 | 29 | NO8 | y |
+--------+-------------+------+-----+
如果订单(订单id)中的所有产品(pro)都可用(可用),我想发送一封电子邮件。到目前为止,我掌握的代码是:
$getData2 = mysql_query("SELECT * FROM notify WHERE avai = 'y'");
while($row = mysql_fetch_object($getData2))
{
//only gets the two with y, does not know that there is a third item that belongs to the order
}
这个过程应该是自动化的,这就是为什么我不能使用基于订单id的选择。类似的,使用反连接模式应该返回
order\u id
,其中有avail='y'
的行,而同一订单id没有avail='n'
的行:
SELECT a.order_id
FROM notify a
LEFT
JOIN ( SELECT n.order_id
FROM notify n
WHERE n.avail = 'n'
GROUP BY n.order_id
) o
ON o.order_id = a.order_id
WHERE a.avail = 'y'
AND o.order_id IS NULL
GROUP BY a.order_id
还有其他方法可以获得等效结果,例如使用NOT EXISTS谓词
SELECT a.order_id
FROM notify a
WHERE a.avail = 'y'
AND NOT EXISTS (SELECT 1
FROM notify n
WHERE n.order_id = a.order_id
AND n.avail = 'n'
)
GROUP BY a.order_id
如果存在除“y”和“n”以外的值,则可能需要调整谓词以考虑这些条件 与
avail='y'
的逻辑相反的是
NOT (avail <=> 'y')
我建议您将n/y更改为枚举(状态)
是|否|通知|订购|装运|收到|退回
SELECT t1.order_id,
(SELECT COUNT(*) FROM table AS t2 WHERE t2.order_id = t1.order_id) AS numOfProducts,
(SELECT COUNT(*) FROM table AS t3 WHERE t3.order_id = t1.order_id AND avai = 'y') AS
numOfAvaiProducts,
FROM table as t1
HAVING numOfAvaiProducts = numOfProducts
GROUP BY t1.order_id
查询未经测试,但它应该可以工作,您可以在这里获得所有订单NUMOFAVAVIPRODUCTS=NUMOFAVIPRODUCTS,在通知用户后,您可以更新要通知的
状态,但下次不会得到此结果
这样做的另一个好处是保存PHP代码和运行时,因为您的表名为notify,我假设它只是用于此电子邮件通知? 然后你可以使用:
SELECT GROUP_CONCAT(avai SEPARATOR ',') FROM notify GROUP BY order_id
然后循环遍历所有返回的行,并在“,”上分解(),这样就可以为每一行获得一个数组,表示每个订单id。现在,只需检查数组中的“n”。如果数组中没有“n”,您将发送电子邮件并删除包含该订单id的所有行。这样,您就不会为同一订单id发送多封电子邮件
我希望这有帮助
如果您需要,您可以阅读GROUP_CONCAT上的内容您只得到2个可用的值y?您能解释一下他想要什么吗?@echo_me:他只想要表中与订单相关联的所有行都可用的订单。如果该订单有行可用,他不想退回该订单。非常感谢您的详细回答!解决了我的问题:)
SELECT GROUP_CONCAT(avai SEPARATOR ',') FROM notify GROUP BY order_id