3

投稿とメタの2つのテーブルがあります

投稿構造:

+---------+---------+
|   id    |  title  |
+---------+---------+

メタ構造:

+---------+---------+---------+
|   post  |   key   |  value  |
+---------+---------+---------+

meta.key が「end」または「result」であるレコードを選択し、post.id でグループ化する必要があります (「end」と「result」の両方のメタ キーがある場合)。

これが私の試みです:

SELECT
posts.id,
posts.title,
meta.post,
meta.`value`,
CASE meta.`key` WHEN 'result' THEN value END AS 'result',
CASE meta.`key` WHEN 'end' THEN value END AS 'end'
FROM
posts
INNER JOIN meta ON posts.id = meta.post
WHERE meta.`key` IN ('result', 'end')

これは、meta.key の「end」と「result」の 2 つの別個のレコードを返します。

+------------+------------+------------+------------+------------+------------+
|    id      |   title    |   post     |   value    |   result   |     end    |
+------------+------------+------------+------------+------------+------------+
|     1      |  Untitled  |      1     |     5      |    (Null)  | 1344240000 |
+------------+------------+------------+------------+------------+------------+
|     1      |  Untitled  |      1     |   88:79    |    88:79   |   (Null)   |
+------------+------------+------------+------------+------------+------------+

必要なのは、これら 2 つのレコードを 1 つにマージすることです。

+------------+------------+------------+------------+------------+------------+
|    id      |   title    |   post     |   value    |   result   |     end    |
+------------+------------+------------+------------+------------+------------+
|     1      |  Untitled  |      1     |     -      |    88:79   | 1344240000 |
+------------+------------+------------+------------+------------+------------+
4

3 に答える 3

1

これは、メタを 2 回 INNER JOIN することで実行できます。つまり、

SELECT

  p.id,
  p.title,
  mr.value AS result,
  me.value AS end

FROM posts AS p

INNER JOIN meta AS mr

  ON mr.post = p.id
  AND mr.`key` = 'result'

INNER JOIN meta AS me
  ON me.post = p.id
  AND me.`key` = 'end';

SQL フィドル リンク: http://sqlfiddle.com/#!2/2a89e/5

于 2013-03-27T19:09:08.863 に答える
0

投稿IDごとに「結果」と「終了」の行が1つだけある限りMAX、元のクエリで集計関数として使用し、最後にposts.idでグループ化できます。あなたの論理がよくわからないVALUEので、今のところ省略しました。

SELECT posts.id, posts.title,
  MAX(CASE meta.`key` WHEN 'result' THEN value END) AS 'result',
  MAX(CASE meta.`key` WHEN 'end' THEN value END)  AS 'end'
FROM posts
INNER JOIN meta ON posts.id = meta.post
WHERE meta.`key` IN ('result', 'end')
GROUP BY posts.id, posts.title

でテストする SQLfiddle

于 2013-03-27T19:15:52.347 に答える
0

データをピボットしようとしているので、通常は次のように集計関数を使用しますCASE

SELECT
  posts.id,
  posts.title,
  -- meta.post,
  -- meta.`value`,
  max(CASE meta.`key` WHEN 'result' THEN value END) AS 'result',
  max(CASE meta.`key` WHEN 'end' THEN value END) AS 'end'
FROM posts
INNER JOIN meta 
  ON posts.id = meta.post
WHERE meta.`key` IN ('result', 'end')
GROUP BY posts.id, posts.title  -- , meta.post, meta.`value`

デモで SQL Fiddle を参照してください

注:value列に 2 つの個別の値を表示しています。値を選択するロジックを決定する必要があります。これは、実行時にそれらが異なる場合、group by複数の行が取得されるためです。CASEこれらの 2 つの列は で使用されており、post列は既に表示されているため、コメントアウトしたことがわかります。

于 2013-03-27T19:05:58.670 に答える