【问题标题】:Optimise Custom Wordpress SQL query优化自定义 Wordpress SQL 查询
【发布时间】:2018-09-05 18:49:09
【问题描述】:

我有一个 wordpress 网站,我正在执行 ajax 请求以返回属性详细信息的 json 对象(与谷歌地图一起使用)。我目前有以下查询:

SELECT
p.ID AS 'id',
p.post_title AS 'title',
t.name AS 'property_type',
c.name AS 'listing_type',
pm.meta_value AS 'address',
pm2.meta_value AS 'latitude',
pm3.meta_value AS 'longitude',
pm4.meta_value AS 'price',
pm5.meta_value AS 'bedrooms',
pm6.meta_value AS 'baths',
pm7.meta_value AS 'show_date',
p.guid,
wm2.meta_value AS 'image'
FROM
wp_posts p
    INNER JOIN
wp_postmeta AS pm ON pm.post_id = p.ID
    INNER JOIN
wp_postmeta AS pm2 ON pm2.post_id = p.ID
    INNER JOIN
wp_postmeta AS pm3 ON pm3.post_id = p.ID
    INNER JOIN
wp_postmeta AS pm4 ON pm4.post_id = p.ID
    INNER JOIN
wp_postmeta AS pm5 ON pm5.post_id = p.ID
    INNER JOIN
wp_postmeta AS pm6 ON pm6.post_id = p.ID
INNER JOIN
wp_postmeta AS pm7 ON pm7.post_id = p.ID
    LEFT JOIN
wp_term_relationships AS r ON (p.ID = r.object_id)
    INNER JOIN
wp_term_taxonomy AS x ON (r.term_taxonomy_id = x.term_taxonomy_id)
    INNER JOIN
wp_terms AS t ON (r.term_taxonomy_id = t.term_id)
    LEFT JOIN
wp_term_relationships AS v ON (p.ID = v.object_id)
    INNER JOIN
wp_term_taxonomy AS z ON (v.term_taxonomy_id = z.term_taxonomy_id)
    INNER JOIN
wp_terms AS c ON (v.term_taxonomy_id = c.term_id)
    LEFT JOIN
wp_postmeta wm1 ON (wm1.post_id = p.id
    AND wm1.meta_value IS NOT NULL
    AND wm1.meta_key = '_thumbnail_id')
    LEFT JOIN
wp_postmeta wm2 ON (wm1.meta_value = wm2.post_id
    AND wm2.meta_key = '_wp_attached_file'
    AND wm2.meta_value IS NOT NULL)
WHERE
pm.meta_key = 'property_address'
    AND pm2.meta_key = 'property_lat'
    AND pm3.meta_key = 'property_lng'
    AND pm4.meta_key = 'property_price'
    AND pm5.meta_key = 'property_beds'
    AND pm6.meta_key = 'property_baths'
    AND pm7.meta_key = 'property_show_date'
    AND x.taxonomy = 'property-type'
    AND z.taxonomy = 'listing-type'
    AND p.post_type = 'property'
    AND p.post_status = 'publish'

完美返回数据:

标识 |标题 |属性类型 |列表类型 |地址 |纬度 |经度 |价格 |卧室 |浴缸|演出日期 |指导

但是,一旦我在网站上拥有多个属性,查询似乎就会很困难,甚至会破坏数据库(完全失去了连接到数据库的能力,导致网站关闭,不得不重新开始使用新的数据库) .我已将问题归结为查询的分类部分:

LEFT JOIN
wp_term_relationships AS r ON (p.ID = r.object_id)
    INNER JOIN
wp_term_taxonomy AS x ON (r.term_taxonomy_id = x.term_taxonomy_id)
    INNER JOIN
wp_terms AS t ON (r.term_taxonomy_id = t.term_id)
    LEFT JOIN
wp_term_relationships AS v ON (p.ID = v.object_id)
    INNER JOIN
wp_term_taxonomy AS z ON (v.term_taxonomy_id = z.term_taxonomy_id)
    INNER JOIN
wp_terms AS c ON (v.term_taxonomy_id = c.term_id)

但我不知道如何改进这一点。 有人有什么想法吗?

【问题讨论】:

  • 您能否更具体地了解破坏数据库的含义?请edit您的问题。查询永远不会完成吗?数据库服务器软件是否崩溃?您的数据是否已损坏?
  • 在这样的查询上运行 EXPLAIN 以查看是否需要更多索引
  • I have pinned the problem down to the taxonomy part of my query - 你介意分享这些信息吗?你可以帮助我们帮助你,你知道的^^
  • 我已经编辑了我的问题以尝试澄清。说到 sql,我是个菜鸟,所以 EXPLAIN 命令对我来说有点陌生。基本上我想知道我的查询是否可以以任何方式改进;性能明智或简化

标签: php mysql sql ajax wordpress


【解决方案1】:
$query = "SELECT DISTINCT
id,
post_title,
guid,
pm.meta_value AS 'address',
pm2.meta_value AS 'latitude',
pm3.meta_value AS 'longitude',
pm4.meta_value AS 'price',
pm5.meta_value AS 'bedrooms',
pm6.meta_value AS 'baths',
pm7.meta_value AS 'show_date',
wm2.meta_value AS 'image',
(SELECT 
        GROUP_CONCAT(wp_terms.name
                SEPARATOR ', ')
    FROM
        wp_terms
            INNER JOIN
        wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id
            INNER JOIN
        wp_term_relationships wpr ON wpr.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
    WHERE
        taxonomy = 'property-type'
            AND wp_posts.ID = wpr.object_id) AS 'property_type',
(SELECT 
        GROUP_CONCAT(wp_terms.name
                SEPARATOR ', ')
    FROM
        wp_terms
            INNER JOIN
        wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id
            INNER JOIN
        wp_term_relationships wpr ON wpr.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
    WHERE
        taxonomy = 'listing-type'
            AND wp_posts.ID = wpr.object_id) AS 'listing_type'
FROM
wp_posts
    INNER JOIN
wp_postmeta AS pm ON pm.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta AS pm2 ON pm2.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta AS pm3 ON pm3.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta AS pm4 ON pm4.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta AS pm5 ON pm5.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta AS pm6 ON pm6.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta AS pm7 ON pm7.post_id = wp_posts.ID
    INNER JOIN
wp_postmeta wm1 ON (wm1.post_id = wp_posts.id
    AND wm1.meta_value IS NOT NULL
    AND wm1.meta_key = '_thumbnail_id')
    INNER JOIN
wp_postmeta wm2 ON (wm1.meta_value = wm2.post_id
    AND wm2.meta_key = '_wp_attached_file'
    AND wm2.meta_value IS NOT NULL)
WHERE
post_type = 'property'
    AND pm.meta_key = 'property_address'
    AND pm2.meta_key = 'property_lat'
    AND pm3.meta_key = 'property_lng'
    AND pm4.meta_key = 'property_price'
    AND pm5.meta_key = 'property_beds'
    AND pm6.meta_key = 'property_baths'
    AND pm7.meta_key = 'property_show_date'";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多