订购MySQL查询结果(使用join)

时间:2015-08-13 01:18:25

标签: mysql wordpress woocommerce

在WordPress安装中,我需要订购产品,以便:

  1. 最后出售的产品。
  2. 已售出的商品标有"古董"出售产品后出现标记"复制。"
  3. 我已成功完成第一项,但我对第二项感到不知所措。我没有收到任何错误。我的问题是我的ORDER BY语句中的所有内容都在工作,除了" wt.slug DESC。"如果我将wp_term_taxonomy和wp_terms表的LEFT JOIN语句更改为INNER JOIN语句,我得到0结果,所以在我看来这些语句没有找到我期望的结果。这是我的疑问:

    SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM wp_posts 
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
    INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
    LEFT JOIN wp_postmeta stock ON ( wp_posts.ID = stock.post_id AND stock.meta_key = '_stock_status' ) 
    LEFT JOIN wp_term_taxonomy wtt ON ( wp_term_relationships.term_taxonomy_id = wtt.term_taxonomy_id AND wtt.taxonomy = 'product_tag' ) 
    LEFT JOIN wp_terms wt ON ( wtt.term_id = wt.term_id AND ( wt.slug = 'antique' OR wt.slug = 'reproduction' ) ) 
    WHERE 1=1 
    AND ( wp_term_relationships.term_taxonomy_id IN (171) ) 
    AND ( ( wp_postmeta.meta_key = '_visibility' AND CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','catalog') ) ) 
    AND wp_posts.post_type = 'product' 
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
    GROUP BY wp_posts.ID 
    ORDER BY wp_posts.post_type DESC, stock.meta_value ASC, wt.slug DESC, wp_posts.post_date
    

    以下是WordPress database description供参考。我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以创建一个新字段

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, CASE wt.slug WHEN 'antique' THEN -1 WHEN 'reproduction' THEN 0 ELSE 1 END as sort_order

并在sort_order子句中使用ORDER BY,如

ORDER BY sort_order DESC

答案 1 :(得分:0)

感谢@mynawaz的帮助,我已经能够提出解决方案。我不确定它是否是最有效或最优雅的解决方案,但它确实有效:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* , CASE wt.slug WHEN 'antique' THEN 1 WHEN 'reproduction' THEN 2 ELSE 0 END as slug_order 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
LEFT JOIN wp_postmeta stock ON ( wp_posts.ID = stock.post_id AND stock.meta_key = '_stock_status' ) 
LEFT JOIN wp_term_relationships wtr ON ( wp_posts.ID = wtr.object_id AND stock.meta_value = 'outofstock' ) 
LEFT JOIN wp_term_taxonomy wtt ON ( wtr.term_taxonomy_id = wtt.term_taxonomy_id AND wtt.taxonomy = 'product_tag' ) 
LEFT JOIN wp_terms wt ON ( wtt.term_id = wt.term_id AND wt.slug IN( 'antique','reproduction' ) ) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (171) ) 
AND ( ( wp_postmeta.meta_key = '_visibility' AND CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','catalog') ) ) 
AND wp_posts.post_type = 'product' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
AND NOT ( 
    stock.meta_value = 'outofstock' 
    AND ( CASE wt.slug WHEN 'antique' THEN 1 WHEN 'reproduction' THEN 2 ELSE 0 END ) = 0 
) 
GROUP BY wp_posts.ID, slug_order 
ORDER BY wp_posts.post_type DESC, stock.meta_value ASC, slug_order DESC, wp_posts.post_date DESC