【问题标题】:Ordering results of MySQL query (using join)MySQL查询的排序结果(使用join)
【发布时间】:2015-08-13 01:18:24
【问题描述】:

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

  1. 售出的产品最后出现。
  2. 标记为“古董”的已售产品显示在标记为“复制品”的已售产品之后。

我已经成功完成了第一项,但我对第二项感到茫然。我没有收到任何错误。我的问题是我的 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 供参考。我将不胜感激。

【问题讨论】:

  • 您得到什么错误消息和/或输出?在对 Wordpress 架构知之甚少的情况下消化查询有点困难。
  • 我已经更新了我的问题,以明确我遇到的问题,并链接到数据库描述(带有架构图像)。

标签: mysql wordpress woocommerce


【解决方案1】:

你可以新建一个字段为

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

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

ORDER BY sort_order DESC

【讨论】:

  • 这是订购我需要的东西的好方法,但它不能解决我的问题,即 JOIN 语句不适用于 wp_terms 和 wp_term_taxonomy 表。
【解决方案2】:

感谢@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

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 2017-09-27
    • 2017-07-25
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多