将MySQL结果转换为简单数组的最佳方法是什么?

时间:2014-02-14 19:34:05

标签: php mysql sql

在很多程序员的帮助下,我一直在努力解决这个问题,没有任何结果。我有一张看起来像这样的表:

meta_id  |  post_id  |  meta_key  |  meta_value
---------|-----------|------------|-------------------
46922    |  5923     |  adlink    | htp://whatever.com
46923    |  5923     |  subloc    | Menu Page
46924    |  5923     |  size      | Premium
46924    |  5923     |  location  | Washington
46924    |  5923     |  image1    | 5924
46924    |  5923     |  image2    | 5925    
46925    |  5928     |  adlink    | htp://whatever.com
46926    |  5928     |  subloc    | Regular Page
46927    |  5928     |  size      | Standard
46927    |  5928     |  location  | Idaho
46927    |  5928     |  image1    | 5926
46927    |  5928     |  image2    | 5927

我有以下查询返回我正在寻找的特定结果,但格式就像表格;即,有许多结果行与一些常见的post_id - 我需要创建一个数组或结果表,我可以从中访问信息,就好像每个DISTINCT post_id创建一个具有该ID唯一数据的行,如下所示:

id   |  adlink            |  sublock    |  size   | location   | image1   | image2
-----|--------------------|-------------|---------|------------|----------|---------
5923 | htp://whatever.com | Menu Page   | Premium | Washington | 5924     | 5925 
5928 | htp://whatever.com | regular Page| Premium | Idaho      | 5926     | 5927 

这是返回正确信息的查询:

SELECT * 
  FROM wp_postmeta 
 WHERE post_id IN (
                    SELECT post_id 
                      FROM wp_postmeta 
                     WHERE (
                                meta_value LIKE '%Washington%'
                            AND meta_key = 'location'
                            )

2 个答案:

答案 0 :(得分:4)

使用条件聚合来转移数据

SELECT post_id,
       MAX(CASE WHEN meta_key = 'adlink'   THEN meta_value END) adlink,
       MAX(CASE WHEN meta_key = 'sublock'  THEN meta_value END) sublock,
       MAX(CASE WHEN meta_key = 'size'     THEN meta_value END) size,
       MAX(CASE WHEN meta_key = 'location' THEN meta_value END) location,
       MAX(CASE WHEN meta_key = 'image1'   THEN meta_value END) image1,
       MAX(CASE WHEN meta_key = 'image2'   THEN meta_value END) image2
  FROM wp_postmeta
 GROUP BY post_id

输出:

| POST_ID |             ADLINK |      SUBLOCK |     SIZE |   LOCATION | IMAGE1 | IMAGE2 |
|---------|--------------------|--------------|----------|------------|--------|--------|
|    5923 | htp://whatever.com |    Menu Page |  Premium | Washington |   5924 |   5925 |
|    5928 | htp://whatever.com | Regular Page | Standard |      Idaho |   5926 |   5927 |

这是 SQLFiddle 演示

答案 1 :(得分:0)

您可以在PHP代码中构建结果表。与此类似:

$result[$row["post_id"]][$row["meta_key"]] = $row["meta_value"];

其中$ row - 来自myssql结果的一行