0

我有一个 sql 查询,但需要来自数据库的显式数据。

我已经上演了每个查询以获取我需要的数据。

SELECT wp_posts.id, 
       wp_posts.post_title, 
       wp_postmeta.meta_key, 
       wp_postmeta.meta_value 
FROM   wp_postmeta 
       LEFT JOIN wp_posts 
              ON wp_postmeta.post_id = wp_posts.id 
WHERE  wp_posts.post_type = 'bolton' 
       AND wp_postmeta.meta_key IN ( 'address', 'age', 'cricket_club', 
                                     'training_times', 
                                     'location', 'player_type', 'coach' ) 

使用此语句,它将地址、年龄、cricket_club 的每一行一起返回。

我需要它来获取地址行的值,而不是列出所有这些的 meta_value 行。

任何建议表示赞赏。

更进一步。

我涉足了一些代码:

SELECT post_id
FROM wp_postmeta
WHERE post_id = (
SELECT max( post_id )
FROM wp_postmeta ) 

但是我想得到这样的东西。

SELECT address
FROM meta_value
WHERE wp_post_meta.meta_key = address

谢谢

4

2 回答 2

1

我怀疑您想取消透视数据,即将不同的数据放入不同的列。(我还怀疑有两次,当您在问题中说row时,您实际上是指column,但这可能只是我。)

如果 unpivot 确实是您所追求的,那么您可以尝试以下方法:

SELECT
  p.id,
  p.post_title,
  MAX(CASE pm.meta_key WHEN 'address'        THEN pm.meta_value END) AS address,
  MAX(CASE pm.meta_key WHEN 'age'            THEN pm.meta_value END) AS age,
  MAX(CASE pm.meta_key WHEN 'cricket_club'   THEN pm.meta_value END) AS cricket_club,
  MAX(CASE pm.meta_key WHEN 'training_times' THEN pm.meta_value END) AS training_times,
  MAX(CASE pm.meta_key WHEN 'location'       THEN pm.meta_value END) AS location,
  MAX(CASE pm.meta_key WHEN 'player_type'    THEN pm.meta_value END) AS player_type,
  MAX(CASE pm.meta_key WHEN 'coach'          THEN pm.meta_value END) AS coach
FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.id
WHERE p.post_type = 'bolton'
  AND pm.meta_key IN ( 'address', 'age', 'cricket_club', 
                       'training_times', 
                       'location', 'player_type', 'coach' ) 
GROUP BY
  p.id,
  p.post_title
;

几点注意事项:

  1. 我用 INNER JOIN 替换了您的 LEFT JOIN,因为wp_posts.type = 'bolton'WHERE 子句中的条件具有基本相同的效果。如果你真的想要一个左连接,那么也许你需要将条件移动到 ON 子句,如下所示:

    ...
    FROM wp_postmeta pm
    INNER JOIN wp_posts p ON pm.post_id = p.id
                         AND p.post_type = 'bolton'
    WHERE pm.meta_key IN ( ...
    ...
    

    但我不确定,你应该自己看看。

  2. 另一个 WHERE 条件wp_postmeta.meta_key IN ( ... )在此查询中不是必需的,因为尽管查询将读取所有元键,但它只会返回那些在 SELECT 子句中定义的列。

    保留条件可能会使查询更有效,但扩展列列表会稍微不方便(以防您需要扩展它):您必须同时扩展条件和 SELECT 子句。

    因此,就性能而言,离开该条件可能是有益的,而在维护方面将其移除可能会更好。当表中的行数不多时,性能上的差异应该可以忽略不计,但是您的情况是否会如此,您需要通过测试来确定。但是,一般的方法可能是首先采用更简单的解决方案,并仅在出现问题时进行优化。

于 2013-02-14T05:54:01.643 回答
0

你能不只是改变

wp_postmeta.meta_key IN ('address','age',...

wp_postmeta.meta_key = 'address';
于 2013-02-13T16:45:15.837 回答