Mysql查询崩溃整个站点

时间:2017-10-19 13:04:02

标签: mysql sql

SELECT
orders.c5_dataset,
orders.orders_id,
orders_products.products_id,
orders_products.products_name,
IFNULL(Sum(orders_products.products_quantity), 0) AS count,
p.product_certain_amount,
p.product_stock_amount,
p.product_group_number,
p.products_status,
p.products_competitor_watch,
p.product_reseller_account_no,
competitor_prices.competitor_prices_price
FROM
orders
LEFT JOIN
orders_total ON orders_total.orders_id = orders.orders_id
LEFT JOIN
orders_products ON orders_products.orders_id = orders.orders_id
LEFT JOIN
(SELECT products.products_id, products.product_reseller_account_no, 
products.product_certain_amount, products.product_stock_amount, 
products.product_group_number, products.products_status, 
products.products_competitor_watch, products.manufacturers_id FROM products 
GROUP BY products.products_id) p ON orders_products.products_id = 
p.products_id
LEFT JOIN
competitor_prices ON competitor_prices.products_id = p.products_id
WHERE
orders_total.class = 'ot_total'
AND
orders.date_purchased > DATE_SUB(now(), INTERVAL '$days' DAY)
GROUP BY
orders_products.products_id
ORDER BY
count DESC

我有这个查询,因为加入了子查询而导致整个网站崩溃..

我无法弄清楚出了什么问题。

我怀疑它可能与产品查询有关。这是一个子查询,因为有些表具有相同的字段,并且如果没有它,则select的count-part会出错。

1 个答案:

答案 0 :(得分:1)

您的查询和子查询加入都存在问题。

您正在使用GROUP BY,这意味着您的选择查询是汇总

在汇总查询中,您只能使用汇总表达式(例如MAX(field)SUM(field)COUNT(field))或用于形成汇总的字段。

因此,如果您按orders_products.products_id进行分组,则您在此处选择的唯一非聚合字段为orders_products.products_id。在您的情况下,所有其他选定的字段必须是聚合函数。

您加入的子查询也是如此。

此外,显然您的数据结构存在问题。让我们看一下你的products表:

SELECT products.products_id, products.product_reseller_account_no, 
products.product_certain_amount, products.product_stock_amount, 
products.product_group_number, products.products_status, 
products.products_competitor_watch, products.manufacturers_id FROM products 
GROUP BY products.products_id

有三种可能性:

  • 产品ID不是此表的唯一标识符,并且有100%重复的产品。这意味着数据库没有很好地保存,您应该尝试修剪重复数据。或者在您的选择中使用DISTINCT。因此GROUP BY是不必要的。

  • 产品ID 表的唯一标识符。然后你的GROUP BY显得很夸张

  • 产品ID不是唯一标识符,并且存在具有不同数据的重复ID。在这种情况下,您的查询只返回每个的第一个,使结果可能(很可能)错误。