1

我想知道是否有人可以帮助我。我有以下两个表:

---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 加入这两个表,然后显示 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

您需要PIVOT将表内的行postmeta分成列,使用CASEwithMAX作为聚合函数来消除NULLs,如下所示:

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 fiddle 中的 Demo

请注意:您当前将所有值存储在同一数据类型的一列中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

加入两次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 回答