【发布时间】:2012-06-11 18:31:46
【问题描述】:
错误的搜索查询使我们的网站崩溃。写这个的人计算了每个子类别,然后将它们加在一起以获得主要类别的总数。 对于分页 Next、Last、Pages,然后使用 JOIN/INNER JOIN(该页面的所有产品)编写查询。它创建了太多的步骤,从而减慢了一切,直到超时。帮助!
查询摘要:
SELECT COUNT(DISTINCT node.nid) AS cnt FROM
content_type_product cp
LEFT JOIN node node ON node.nid = cp.nid
LEFT JOIN uc_products uc_products ON node.nid = uc_products.nid
LEFT JOIN users users ON users.uid = node.uid
LEFT JOIN files ON files.fid = cp.field_product_image_1_value
LEFT JOIN content_type_product_tags ct ON ct.field_product_product_id_value = cp.nid
WHERE
(
node.status <> N
)
AND
(
ct.field_product_tag_id_value = N
)
AND
(
cp.field_deleted_value <> N
)
AND
(
cp.field_stock_level_value > N
)
AND EXISTS
(
SELECT scp.nid FROM content_type_store scp
LEFT JOIN node snode ON snode.nid = scp.nid
LEFT JOIN users susers ON susers.uid = snode.uid
WHERE susers.name = users.name
AND scp.field_shop_activated_value = 'S'
AND scp.field_shop_suspended_value = 'S')
ORDER BY cp.field_product_last_changed_value DESC;
查询示例:
SELECT count(Distinct node.nid) as cnt
FROM content_type_product cp
LEFT JOIN node node ON node.nid = cp.nid
LEFT JOIN uc_products uc_products ON node.nid = uc_products.nid
LEFT JOIN users users ON users.uid = node.uid
LEFT JOIN files ON files.fid = cp.field_product_image_1_value
LEFT JOIN content_type_product_tags ct ON ct.field_product_product_id_value = cp.nid
WHERE
(
node.status <> 0
)
AND
(
ct.field_product_tag_id_value = 478
)
AND
(
cp.field_deleted_value <> 1
)
AND
(
cp.field_stock_level_value > 0
)
AND EXISTS
(
SELECT scp.nid FROM content_type_store scp
LEFT JOIN node snode on snode.nid = scp.nid
LEFT JOIN users susers on susers.uid = snode.uid
WHERE susers.name = users.name
AND scp.field_shop_activated_value = '1'
AND scp.field_shop_suspended_value = '0'
)
ORDER BY cp.field_product_last_changed_value DESC
【问题讨论】:
-
我建议从一张纸上的流程图重新开始。首先写下需要在页面上显示的数据。然后写下需要从哪些相关表中获取。然后制作一个流程图,以便您了解何时采取了什么,然后在此基础上构建一个查询。当您采用这种方法时,您可以进行复杂的查询,而不会忘记做什么。
-
如果您正确格式化查询以使其更具可读性,您将更容易获得帮助。
-
作为一个额外的提示,您的
order by似乎没用;您正在使用分析函数。