PHP SQL连接表行作为键

PHP SQL连接表行作为键,php,sql,join,Php,Sql,Join,我想知道是否有人能帮我。我有以下两个表格: ---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连接这两个表,然后显示m

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

---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_键。像这样的

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;

任何帮助都将不胜感激。Cheers

您需要
将表中的行
postETA
转换为列,使用
CASE
MAX
作为聚合函数来消除
NULL
如下:

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
这是一个
请注意:您当前正在将
age
email
的所有值存储在与
varchar
相同数据类型的一列中,例如,如果要执行某些操作,您必须在查询中将
age
值强制转换为
INT
稍后进行计算,我将这部分留给您。

您需要
将表中的行
postETA
透视成列,使用
CASE
MAX
作为聚合函数来消除
NULL
如下:

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
这是一个 请注意:您当前正在将
age
email
的所有值存储在与
varchar
相同数据类型的一列中,例如,如果要执行某些操作,您必须在查询中将
age
值强制转换为
INT
计算之后,我把这部分留给你了。

应该是这样的

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;
应该是这样的

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;

两次加入
postETA
表:

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' ;

两次加入
postETA
表:

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' ;

不要将meta_键保存在新行中,而是尝试使您的表结构如下

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;
您可以向表结构添加更多字段

然后,您可以进行一个简单的连接查询,这将节省执行查询的时间和资源。 像这样

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;

不要将meta_键保存在新行中,而是尝试使您的表结构如下

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;
您可以向表结构添加更多字段

然后,您可以进行一个简单的连接查询,这将节省执行查询的时间和资源。 像这样

SELECT posts.post_id, 
       postmeta.age, 
       postmeta.email, 
FROM 
       posts  
JOIN posts 
ON posts.post_id = postmeta.post_id 
SELECT posts.post_id,
postmeta.age,
postmeta.email,
FROM
posts
JOIN postsmeta
ON posts.post_id = postmeta.post_id
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;

您正在加入posts上的
帖子,而不是Posteta上的
帖子
?这是你问题中的一个输入错误吗?你不远,你只是犯了一个小错误:
posts.id
(而不是
posts.post\u id
),
JOIN
是正确的方法,只是让自己更舒服一点。我建议阅读PHP手册中的所有内容,并搜索教程和书籍。另外,首先在mysql的命令行版本中运行SQL,以便在将其放入PHP代码之前进行测试。或者,如果你喜欢GUI,可以使用Mysql GUI。你加入的是POST上的
帖子,而不是POSTETA上的
帖子
?这是你问题中的一个输入错误吗?你不远,你只是犯了一个小错误:
posts.id
(而不是
posts.post\u id
),
JOIN
是正确的方法,只是让自己更舒服一点。我建议阅读PHP手册中的所有内容,并搜索教程和书籍。另外,首先在mysql的命令行版本中运行SQL,以便在将其放入PHP代码之前进行测试。或者,如果你喜欢GUI,可以使用Mysql GUI。这里没有
帖子。post\u id
,这里有
帖子。id
@Havelock好的,谢谢,现在修复。谢谢百万马哈茂德!我想知道如何将值转换为INT,它是否只是将(pm.age,INT)转换为age?再次感谢@用户774715,如果您感兴趣,此数据库模型称为,这里是如果您想了解更多信息这里没有
帖子。post\u id
,这里有
帖子。id
@Havelock好的,谢谢,现在修复。谢谢百万马哈茂德!我想知道如何将值转换为INT,它是否只是将(pm.age,INT)转换为age?再次感谢@user774715,如果您感兴趣,这个数据库模型称为,如果您想了解更多信息,请点击这里