1

誰かが私を助けてくれないかと思っていました。次の2つのテーブルがあります。

---Posts----

id  | title | content |  
544 | Alan  | Blah

---Postmeta----

metaid | post_id | meta_key | meta_value  
1      |  544    | age      | 45  
2      |  544    | email    | test@hotmail.co.uk

post_idで2つのテーブルを結合してから、meta_keysを表示したいと思います。このようなもの

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 

どんな助けでも大歓迎です。乾杯

4

6 に答える 6

3

次のようにsを削除するために、集計関数としてwithを使用してPIVOT、テーブル内の行を列に変換する必要があります。postmetaCASEMAXNULL

SELECT p.id, pm.age, pm.email
FROM posts p
JOIN
(
   SELECT
     post_id,
     MAX(CASE WHEN meta_key = 'age'   THEN  meta_value END) AS age,
     MAX(CASE WHEN meta_key = 'email' THEN meta_value END) AS email
   FROM postsmeta
   GROUP BY post_id
) pm ON p.id = pm.post_id

これがSQLフィドルのデモです

注:現在、同じデータ型の1つの列にすべての値を格納していますage。たとえば、後で計算を実行する場合のように、クエリに値をキャストする必要があります。 、そして私はあなたのためにこの部分を残しました。emailvarcharageINTINT

于 2012-09-26T10:32:07.920 に答える
1
SELECT
  posts.id,
  postmeta.key,
  postmeta.meta_value
FROM
  posts
JOIN
  postmeta ON posts.id = postmeta.post_id
WHERE
  postmeta.key IN ('age', 'email')
于 2012-09-26T10:34:37.890 に答える
0
SELECT posts.id, 
       postmeta.age, 
       postmeta.email, 
       m.meta_key, 
       m.meta_value
FROM 
       posts  p
JOIN Postmeta m
ON p.id = m.post_id 
于 2012-09-26T10:35:29.713 に答える
0

こんな感じになります

SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
于 2012-09-26T10:32:38.470 に答える
0

テーブルに2回参加する:postmeta

SELECT p.id, 
       pm1.meta_value AS age, 
       pm2.meta_value AS email
FROM 
       posts AS p
  LEFT JOIN 
       postmeta AS pm1
    ON pm1.post_id = p.id
   AND pm1.meta_key = 'age'

  LEFT JOIN 
       postmeta AS pm2
    ON pm2.post_id = p.id 
   AND pm2.meta_key = 'email' ;
于 2012-09-26T10:42:21.240 に答える
0

meta_keyを新しい行に保存する代わりに、次のようなテーブル構造を作成してみてください

metaid | post_id | age | email  
1      |  544    | 45  | test1@hotmail.co.uk  
2      |  545    | 51  | test2@hotmail.co.uk  
3      |  546    | 20  | test3@hotmail.co.uk  
4      |  547    | 26  | test4@hotmail.co.uk  

テーブル構造にさらにフィールドを追加できます。

その後、単純な結合クエリを作成できます。これにより、クエリを実行するための時間とリソースを節約できます。このような

SELECT posts.post_id, postmeta.age, postmeta.email FROM posts JOIN postmeta ON posts.post_id = postmeta.post_id;
于 2012-09-26T10:44:32.673 に答える