【问题标题】:Cannot query multiple values on an Inner Join无法在内部联接上查询多个值
【发布时间】:2014-02-13 16:16:45
【问题描述】:

我正在使用此 sql 来返回基于具有 3 个元值的内部联接的结果。它似乎只适用于 1 AND ( ),当我添加其他两个时它返回 0 结果。

SELECT * FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id )
WHERE wp_posts.post_type = 'plot'
AND wp_posts.post_status = 'publish'
AND ( wp_postmeta.meta_key = 'plot_type' AND wp_postmeta.meta_value = 'Cottage' )
AND ( wp_postmeta.meta_key = 'number_of_bedrooms' AND wp_postmeta.meta_value = '2' )
AND ( wp_postmeta.meta_key = 'property' AND wp_postmeta.meta_value = '446' )
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_title ASC;

【问题讨论】:

    标签: mysql sql database wordpress


    【解决方案1】:

    我认为您打算将 OR 与其他 2 一起使用(见下文)。同一个字段不能是 2 个不同的东西,这就是你得到 0 个结果的原因。

    SELECT *
      FROM wp_posts
     INNER JOIN wp_postmeta
        ON (wp_posts.ID = wp_postmeta.post_id)
     WHERE wp_posts.post_type = 'plot'
       AND wp_posts.post_status = 'publish'
       AND ((wp_postmeta.meta_key = 'plot_type' AND
           wp_postmeta.meta_value = 'Cottage') OR
           (wp_postmeta.meta_key = 'number_of_bedrooms' AND
           wp_postmeta.meta_value = '2') OR (wp_postmeta.meta_key = 'property' AND
           wp_postmeta.meta_value = '446'))
     GROUP BY wp_posts.ID
     ORDER BY wp_posts.post_title ASC;
    

    编辑,改用下面的方法:

    select * from wp_posts
    join wp_postmeta on wp_posts.ID = wp_postmeta.post_id
    where wp_posts.post_type = 'plot'
      and wp_posts.post_status = 'publish'
      and concat(wp_postmeta.meta_key,'|',wp_postmeta.meta_value)
            in ('plot_type|Cottage',
               'number_of_bedrooms|2',
               'property|446');
    

    【讨论】:

    • 感谢您的快速回复 :) 我已经尝试过该代码,但不幸的是它没有过滤特定于所有这些条件的帖子:/
    • 尝试我刚刚编辑的第二个查询。顺便说一句,您的 group by 条款的目的是什么?您没有使用任何聚合函数。
    【解决方案2】:

    您需要为所需的每种类型的值加入一次 wp_postmeta 表。

    SELECT whatever, whatever
      FROM wp_posts AS p
    
      JOIN wp_postmeta AS plottype 
        ON (p.ID = plottype.post_id AND plottype.meta_key = 'plot_type')
    
      JOIN wp_postmeta AS bedrooms
        ON (p.ID = bedrooms.post_id AND bedrooms.meta_key = 'number_of_bedrooms')
    
      JOIN wp_postmeta AS property
        ON (p.ID = property.post_id AND property.meta_key = 'property')
    
     WHERE wp_posts.post_type = 'plot'
       AND wp_posts.post_status = 'publish'
    
       AND plottype.meta_value = 'Cottage' 
       AND bedrooms.meta_value = '2'
       AND property.meta_value = '466'
    
     GROUP BY wp_posts.ID
     ORDER BY wp_posts.post_title ASC;
    

    这个wp_postmeta 键/值存储有点难以加入;您的加入条件需要提取适当的密钥以及匹配的帖子 ID。

    众所周知,SELECT * 在软件中是个坏主意。当您加入这么多表时,情况尤其糟糕。在结果集中列出您需要的列。

    另请注意,您使用的是INNER JOINJOIN 是其同义词。如果您从元数据中提取的任何值丢失,结果集中的行也会丢失。使用 LEFT JOIN 可能会更好,也可能不会更好(您没有解释查询的目的。)

    【讨论】:

    • 嗨 Ollie,我有一个搜索过滤器,The Plot 具有 type=cottageBedroom=2 的属性,并且它与另一个使用属性 ID 的“属性”类型的帖子类型相关。我尝试将 WP Query 与 Meta 查询一起使用,但它没有返回正确的结果,因此我选择直接通过 SQL 进行搜索
    • 我明白了。您可以按照我展示的方式实现您的过滤器,例如说AND plottype.meta_value IN ('Cottage', 'Cabin') AND bedrooms.meta_value BETWEEN 2 AND 3
    【解决方案3】:

    您的条件的某些结构似乎应该更改。

    尝试以下方法:

    SELECT * FROM wp_posts
    INNER JOIN wp_postmeta
    ON ( wp_posts.ID = wp_postmeta.post_id )
    WHERE wp_posts.post_type = 'plot'
    AND wp_posts.post_status = 'publish'
    AND (
            (wp_postmeta.meta_key = 'plot_type' AND wp_postmeta.meta_value = 'Cottage')
            OR
            (wp_postmeta.meta_key = 'number_of_bedrooms' AND wp_postmeta.meta_value = '2')
            OR 
            (wp_postmeta.meta_key = 'property' AND wp_postmeta.meta_value = '446')
        )
    ORDER BY wp_posts.post_title ASC;
    

    【讨论】:

      【解决方案4】:

      我设法使用 WP_Meta_Query 解决了这个问题,它产生的 SQL 是......

      SELECT wp_posts.* FROM wp_posts 
      INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
      INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
      INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
      
      WHERE 1=1
      
      AND wp_posts.post_type = 'plot'
      AND (wp_posts.post_status = 'publish')
      AND ( 
      (wp_postmeta.meta_key = 'property' AND CAST(wp_postmeta.meta_value AS CHAR) = '180') 
        AND (mt1.meta_key = 'plot_type' AND CAST(mt1.meta_value AS CHAR) = 'Cottage') 
        AND (mt2.meta_key = 'number_of_bedrooms' AND CAST(mt2.meta_value AS CHAR) = '2')
      ) 
      GROUP BY wp_posts.ID
      ORDER BY wp_posts.post_title ASC;
      

      感谢大家的帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        • 2016-10-27
        • 2018-01-05
        • 2010-09-20
        • 2019-07-04
        • 2015-01-03
        相关资源
        最近更新 更多