3

wordpress データベースから情報を取得しようとしています。必要なデータは 3 つのテーブルに分散しています。

  • wp_em_events
  • wp_em_locations
  • wp_postmeta

簡略図:

wp_em_events
+-----+--------+-----+
| id  | loc_id | a   |
+-----+--------+-----+
|   1 | 3      | foo |
|   2 | 4      | bar |
+-----+--------+-----+

wp_em_locations
+--------+----+
| loc_id | b  |
+--------+----+
|    3   | x  |
|    4   | y  |
+--------+----+

wp_postmeta
+-------+------+------+
|post_id| key  |value |
+-------+------+------+
|    1  | name | dave |
|    1  | age  | 14   |
|    2  | name | rob  |
|    2  | age  | 20   |
+-------+------+------+

$querystr = "
    SELECT *
    FROM wp_em_events
    LEFT JOIN wp_em_locations ON wp_em_events.loc_id = wp_em_locations.loc_id
    LEFT JOIN wp_postmeta ON wp_em_events.id = wp_postmeta.post_id
    WHERE wp_em_events.id = 1
    GROUP BY wp_em_events.location_id, wp_em_events.id
";

これは以下を返します:

+-----+--------+-----+----+-----+-------+
| id  | loc_id | a   |  b | key | value |
+-----+--------+-----+----+-----+-------+
|   1 | 3      | foo |  x | age |  20   |
+-----+--------+-----+----+-----+-------+

私のGROUP BYが名前を破壊した場所->私が受け取りたいdave :

+-----+--------+-----+----+-----+-----+
| id  | loc_id | a   |  b | name| age |
+-----+--------+-----+----+-----+-----+
|   1 | 3      | foo |  x | dave|  14 |
+-----+--------+-----+----+-----+-----+

すべてのメタ レコードを取得し、できればキー -> 値として親レコードに関連付ける必要があります。

4

2 に答える 2

3

まあ、あなたはこれを行うことができます..

SELECT e.id, 
       e.loc_id, 
       e.a, 
       l.b, 
       p_name.Value `Name`, 
       p_age.Value  Age 
FROM   wp_em_events e 
       INNER JOIN wp_em_locations l 
         ON e.loc_id = l.loc_id 
       INNER JOIN wp_postmeta p_name 
         ON e.id = p_name.Post_id 

       INNER JOIN wp_postmeta p_age 
         ON e.id = p_age.Post_id 

WHERE  e.id = 1 
            AND p_name.`key` = 'name' 
            AND p_age.`key` = 'age' 

デモ

ただし、クエリを動的に構築する必要があります。具体的には、列名とエイリアス、および WHERE 句

于 2012-05-10T21:39:33.253 に答える
0

動的ピボット テーブルを実行します。here 私のプロジェクトの1つに使用している例があります。あなたのケースとは直接関係ありませんが、あなたはその点を理解します。

create table testowy_pivot
            (
             name varchar(255),
             color varchar(255),
             quantity int
            )

insert into testowy_pivot (name, color, quantity) values ('road frames','black',null)
insert into testowy_pivot (name, color, quantity) values ('road frames','red',null)
insert into testowy_pivot (name, color, quantity) values ('helmets','red',288)
insert into testowy_pivot (name, color, quantity) values ('helmets','black',324)
insert into testowy_pivot (name, color, quantity) values ('helmets','blue',216)
insert into testowy_pivot (name, color, quantity) values ('socks','white',180)
insert into testowy_pivot (name, color, quantity) values ('socks','white',216)


DECLARE @columns VARCHAR(8000)

SELECT
@columns = COALESCE(@columns + ',[' + cast(color as varchar) + ']','[' + cast(color as varchar)+ ']')
FROM testowy_pivot
GROUP BY color


DECLARE @query VARCHAR(8000)

SET @query = '
           SELECT *
                     FROM testowy_pivot
                               PIVOT
                                  (
                           sum(quantity) --sum, max, etc.
                               FOR [color]
                               IN (' + @columns + ')
                                  )
                     AS p'

EXECUTE(@query)

select * from testowy_pivot

よろしく、M.

于 2012-05-10T21:27:31.737 に答える