Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:查找订单中包含的所有产品_Php_Mysql - Fatal编程技术网

PHP:查找订单中包含的所有产品

PHP:查找订单中包含的所有产品,php,mysql,Php,Mysql,我想通知用户他们选择的所有产品是否都可用。我创建了一个mysql表,其中包含以下信息: +--------+-------------+------+-----+ | id | order_id | pro | avai| +--------+-------------+------+-----+ | 1 | 28 | NO1 | y | | 2 | 28 | NO2 | y | | 3 | 28

我想通知用户他们选择的所有产品是否都可用。我创建了一个mysql表,其中包含以下信息:

+--------+-------------+------+-----+
| 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