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,如果您感兴趣,这个数据库模型称为,如果您想了解更多信息,请点击这里