Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql从4个表中选择_Php_Mysql_Wordpress - Fatal编程技术网

Php mysql从4个表中选择

Php mysql从4个表中选择,php,mysql,wordpress,Php,Mysql,Wordpress,也许这太复杂了,但我无法在WordPress插件中使用此查询获得结果: 我有4张桌子: k:子数据(id=k.id) p:父数据(id=用户id) u:用户元数据(id=用户\u id) 父子关系数据(r.ID |用户ID | k.ID) 我希望有一个结果,根据关系表中的关系列出所有子数据及其父数据和父名称+电子邮件(来自元数据表) 我被这件事困住了: SELECT k.*, p.*, u1.meta_value AS parent_lastname, u2.meta_value A

也许这太复杂了,但我无法在WordPress插件中使用此查询获得结果:

我有4张桌子:

  • k:子数据(id=k.id)
  • p:父数据(id=用户id)
  • u:用户元数据(id=用户\u id)
  • 父子关系数据(r.ID |用户ID | k.ID)
我希望有一个结果,根据关系表中的关系列出所有子数据及其父数据和父名称+电子邮件(来自元数据表)

我被这件事困住了:

SELECT 
k.*, 
p.*, 
u1.meta_value AS parent_lastname, 
u2.meta_value AS parent_firstname, 
u3.meta_value AS parent_email
FROM kids k, parents p, usermeta u1, usermeta u2, usermeta u3
LEFT JOIN relations r 
  ON (p.user_id = r.user_id 
   AND k.ID = r.kid_id 
   AND u1.user_id = r.user_id 
   AND u2.user_id = r.user_id 
   AND u3.user_id = r.user_id)
WHERE r.user_id = u1.user_id
   AND u1.meta_key = 'last_name'
   OR u2.meta_key = 'first_name'
   OR u3.meta_key = 'email'
GROUP BY k.ID

提前谢谢。

不需要分组。虽然如果一个孩子有两个父母记录,你可能想用它将两个父母分组到一行,但不确定这是否是你的要求。如果一个孩子有两个父母,那么将为该孩子返回的父母是未定义的

假设所有孩子都有父母,所有父母都有名字、姓氏和电子邮件:-

SELECT 
k.*, 
p.*, 
u1.meta_value AS parent_lastname, 
u2.meta_value AS parent_firstname, 
u3.meta_value AS parent_email
FROM kids k
INNER JOIN relations r ON k.ID = r.kid_id
INNER JOIN parents p ON p.user_id = r.user_id
INNER JOIN usermeta u1 ON r.user_id = u1.user_id AND u1.meta_key = 'last_name'
INNER JOIN usermeta u2 ON r.user_id = u1.user_id AND u1.meta_key = 'first_name'
INNER JOIN usermeta u3 ON r.user_id = u1.user_id AND u1.meta_key = 'email'
如果该假设错误,则将内部联接更改为左侧外部联接

SELECT 
k.*, 
p.*, 
u1.meta_value AS parent_lastname, 
u2.meta_value AS parent_firstname, 
u3.meta_value AS parent_email
FROM kids k
LEFT OUTER JOIN relations r ON k.ID = r.kid_id
LEFT OUTER JOIN parents p ON p.user_id = r.user_id
LEFT OUTER JOIN usermeta u1 ON r.user_id = u1.user_id AND u1.meta_key = 'last_name'
LEFT OUTER JOIN usermeta u2 ON r.user_id = u1.user_id AND u1.meta_key = 'first_name'
LEFT OUTER JOIN usermeta u3 ON r.user_id = u1.user_id AND u1.meta_key = 'email'

我猜
家长电子邮件
是一个拼写错误?你不应该混合连接语法。用一个或另一个,而不是两个都用。不要使用隐式连接语法。在这种情况下,一个孩子可以有多个父母,可能需要GROUP BY——因为您的评论,我按关系ID将其分组:如果有多个父母,则该孩子会出现多次。更正WordPress中的用法:用户电子邮件存储在表“users”中,而不是“user\u meta”中。但是通过这种方法,也可以很容易地加入“用户”表。如果你很高兴一个孩子被多次列出(每个家长一次),那么我认为不需要分组。如果需要,可以使用一个字段将父详细信息分组到一个字段中。