我正在寻找解决方案,以检查是否多行从一个表有匹配在其他表。在我的情况下,我需要检查订单中的项目是否在存储中。目前,我使用php检查订单-script将打开的订单和foreach一个接一个地检查存储。它产生了相当多的查询,这是不是效率在所有,我正在寻找解决方案,以做这通过sql查询。
期望的结果应该是:
OrderId | Date | Products
1002/02 | 2020/08/16 | 1x Ipod; 2x battery; 9x some item;
0333/4 | 2020/06/22 | 10x shelf
存储产品表
id | id_product | quantity
订单
id | reference | id_status | created_at
订购产品
Id | id_order | quantity | id_storage_product
我已经写了一些代码来生成上面可见的表,但是结果它甚至没有接近期望。
select('orders.id', orders.created_at','orders.reference', 'storage_products.id as storageProductId')
->join('order_products', 'orders.id', '=', 'order_products.id_order')
->join('storage_products', 'order_products.id_product', '=', 'storage_products.id_product')
->where('storage_products.quantity', '>=', 'order_products.quantity')
->whereIn('orders.id_status', array(1, 2)) //get new orders/ open
->where('order_products.id_storage_product', null)
->groupBy('orders.id');
清除SQL:
SELECT `orders`.`id`,
`orders`.`created_at`,
`orders`.`reference`,
`storage_products`.`id` AS `storageProductId`,
`order_products`.`id_order`
FROM `orders`
INNER JOIN `order_products`
ON `orders`.`id` =
`order_products`.`id_order`
INNER JOIN `storage_products`
ON `order_products`.`id_product` =
`storage_products`.`id_product`
WHERE `storage_products`.`quantity` >=
'order_products.quantity'
AND `orders`.`id_status` IN ( 1, 2 )
AND `order_products`.`id_storage_product` IS NULL
GROUP BY `orders`.`id`
ORDER BY `orders`.`id` ASC
因此代码应该查找未结订单(id_status);储存数量等于或大于产品顺序的;其中id_storage_products为空(表示在网站上购买的产品,但在订购时未存储)。上查询结果是错误的,因为它显示了与存储部分匹配--即使没有检查数量(有些产品有0,但仍然显示)。
如有任何帮助,多谢
编辑:fiddle示例:https://www.db-fiddle.com/f/6jkvkxpyvslexgm3qv1nhu/0
我在db-fiddle链接上尝试了下面的查询,结果成功了。
SELECT
orders.reference, orders.created_at, order_products.id_product
FROM
storage_products
LEFT JOIN
order_products ON storage_products.id_product = order_products.id_product
LEFT JOIN
orders ON orders.id = order_products.id_order;
我在查询中所做的是用order_products中相同的id_product
调用所有的storage_products,然后继续调用所调用的order_products中的所有订单。
您的查询包含以下条件:
AND `order_products`.`id_storage_product` IS NULL
但在示例数据中,所有值都是0
。
因此我使用coalesce()
来覆盖这两种情况。
还删除了条件:
AND `orders`.`id_status` IN ( 1, 2 )
因为列ID_status
不包括在示例数据中表orders
的定义中。
此查询有效:
SELECT o.id,
o.reference,
o.created_at,
GROUP_CONCAT(op.quantity, 'x', op.id_product separator ' ;') products
FROM orders o
INNER JOIN order_products op ON o.id = op.id_order
INNER JOIN storage_products sp ON op.id_product = sp.id_product
WHERE sp.quantity >= op.quantity AND COALESCE(op.id_storage_product, 0) = 0
GROUP BY o.id, o.reference, o.created_at
ORDER BY o.id ASC
请参阅演示。
结果:
| id | reference | created_at | products |
| --- | --------- | ------------------- | ------------- |
| 2 | 345554/02 | 2020-08-22 00:00:00 | 3x188 ; 1x155 |
如果您还加入了表products
(我假设有这样一个表),您可以获得产品的名称,而不是它们的ID。
我想按价格、日期和发布年份等项目对产品进行排序。在发布年份的情况下,我做了一个分类法=发布年份 但它是不工作.我怎么能改变代码可能排序按发布年份顺序?
问题内容: 我正在为我的网上商店订购系统。我有2张桌子: 产品,存储有关产品的信息 订单,存储客户订单的一般ID和信息。 现在,我想拥有一种将复杂的客户订单存储在数据库中的方法。我需要一些东西让我知道订单中每种产品的大小(S,M或L)有多少。 棘手的部分是我希望能够添加/编辑/删除产品(当然不影响过去的订单),因此该方法应该灵活 我应该怎么做呢? 每个订单都有一个单独的表格,产品作为行? 所有订单
让我告诉你一个我遇到的问题的例子。例如,我们有一个名为“订单”的表,其中插入了所有订单和采购。 表A(订单): 现在我想订购并获得我们最畅销的产品,例如在最畅销产品列表中获得pro3排名。 查询输出: 我写了这个查询: 结果对我没用。例如,我需要让pro27在畅销产品中排名(我们有100000个产品!)
在函数的单个产品页面中获取产品的SKU时,我遇到了很多麻烦。php。我有多个单一产品页面,我希望根据产品显示不同的文本。我已经创建了一个子主题,我正在处理函数。php文件。我不熟悉wordpress和编辑主题,所以我还不太了解操作顺序。我能够让代码循环运行,并为所有产品提供所有SKU,但这与我所处的实际页面无关。 我试过很多东西。常见的解决方案似乎是: 但那不起作用。由于某些原因,$producs
我尝试了很多,但当我找不到解决方案时,我将第一个问题发布在这里: 我有四张桌子: 当然,一个客户只能在一个订单中订购一次产品 在一个查询中,我想返回每个customer\u id以及order\u id和product\u id,这些客户在多个订单中订购了任何产品。 换句话说,对于每个客户,我希望找到客户多次订购的不同产品(在单独的订单中),以及product\u id和order\u id。因此
我目前正在处理一个WooCommerce主题,并试图在产品详细信息页面中添加一个侧栏。 我已经能够添加侧边栏(特别是这个:http://woocommerce.wp-a2z.org/oik_file/templatescontent-widget-product-php/) 现在,我正在想如何在当前选择的产品中添加一类“活动”,但似乎无法解决? 换言之,如果当前产品id等于侧栏中的产品id,我该如
我用下面的代码在我的WordPress网站上获得了WooCommerce形式的产品类别列表: 这工作正常,并返回产品类别的列表。我现在一直试图得到一个特定类别的产品列表。 示例:使用获取的所有产品。 我知道产品是作为帖子存储的,并且一直在努力做到这一点,但似乎做不到。 如何获取特定类别的产品列表?
问题内容: 我很难提出一个查询,该查询将找到同时购买了PROD1和PROD2的所有客户。 这是一个伪查询,看起来像我想要做的:(显然这是行不通的) 因此,基本上,我正在尝试对表中有product_id’ ‘和’ ‘事务的不同用户ID的数量进行计数。每个事务都存储在表中的一行中。 问题答案: 我通过以下方式进行这种类型的查询: @najmeddine显示的解决方案还会产生您想要的答案,但在MySQL