2017-07-18 74 views
0

注意:这不是以下形式的副本:mySQL - Create a New Table Using Data and Columns from Three Tables。这个问题是关于从多个表中获取数据并实际创建一个包含该数据的新表。我只是想选择已经存在的数据。关于这个问题的答案对于被问到的问题是非常具体的,并且对我没有帮助,因为答案中的代码没有解释。所以不,这根本不是“完全相同的问题”。将来自多个行的多个MySql表的数据合并到SELECT语句的单个行中

我有一个关于加入两个MySQL表的问题,我似乎无法找到答案。通常的连接类型似乎不是我所追求的。也许这是不可能的,我不确定。

所以我有我喜欢这首台(简化作示例表):

ID Name Email    Phone 
1  John [email protected] 000-123-4567 
2  Jane [email protected] 000-890-1234 

我的第二个表被安排是这样的:

ID UserID meta_key   meta_value 
1 1   location_review  4 
2 1   condition_review 1 
3 1   price_review  5 
4 2   location_review  4 
5 2   condition_review 2 
6 2   price_review  4 

我与一些现有的软件工作,只是做一些修改,所以理想情况下,我可以做我所需要的,而不需要改变软件写得太多。

我想能够让他们看起来像这样加入这些表:

ID Name Email    Phone   location_review condition_review price_review 
    1  John [email protected] 000-123-4567 4     1     5 
    2  Jane [email protected] 000-890-1234 4     2     4 

所以我需要添加从表2有用户ID已经在表1中的数据行。

由于这是现有的软件已经存在的地方,连接这两个表的一些代码,它是在这里:

SELECT * 
FROM wpnf_comments as comment 
    INNER JOIN wpnf_commentmeta AS meta 
WHERE comment.comment_post_ID = $prop_ID 
AND meta.meta_key = 'rating' 
AND meta.comment_id = comment.comment_ID 
AND (comment.comment_approved = 1 
    OR comment.user_id = $userID 
    ) 

什么我做的是:曾经有只有一个“等级”值,存储在元表中。你可以看到它在上面加入它说:

AND meta.meta_key = 'rating' 

但是,我想用3个单独的评级替换。所以上面的联合,以前只有一个评级时才工作,当我有多个评级时,它并不真正起作用。

我非常感谢任何见解,我需要做什么来解决这个问题。如果有问题,我也使用PHP。

编辑

这是我到目前为止的代码。它显示了我现在需要的所有正确的列名称,但实际值/数据未显示出来。它返回0行。

SELECT 
    * 
FROM 
    wpnf_comments t1 
    INNER JOIN 
    (SELECT 
     comment_id as comment_id2, 
     MAX(IF(meta_key = 'location-rating', meta_value, NULL)) AS location_rating, 
     MAX(IF(meta_key = 'condition-rating', meta_value, NULL)) AS condition_rating, 
     MAX(IF(meta_key = 'maintenance-rating', meta_value, NULL)) AS maintenance_rating, 
     MAX(IF(meta_key = 'professionalism-rating', meta_value, NULL)) AS professionalism_rating, 
     MAX(IF(meta_key = 'contact-rating', meta_value, NULL)) AS contact_rating, 
     MAX(IF(meta_key = 'availability-rating', meta_value, NULL)) AS availability_rating, 
     MAX(IF(meta_key = 'responsiveness-rating', meta_value, NULL)) AS responsiveness_rating, 
     MAX(IF(meta_key = 'price-rating', meta_value, NULL)) AS price_rating 
    FROM 
     wpnf_commentmeta 
    GROUP BY comment_id) temp_t 
     ON t1.comment_post_ID = temp_t.comment_id2 
+0

是否有人可以帮助我吗?我已经花了至少两个小时,现在没有运气。 –

+0

如果因为重新发生的meta_key值而在关系数据库上使用[normalization](https://stackoverflow.com/questions/246701/what-is-normalisation-or-normalization),那会更好。这意味着你需要第三个表格来存储数据。能够创建第三个表格还是仅限于这两个表格? – MinistryofChaps

+0

@Ministryof可能软件将把数据放到这两个现有的表中,除非我重新编写了相当多的代码。所以理想情况下,我想只使用这两个表,否则我会不断需要使用这两个表中的数据更新第三个表。 –

回答

2

使用MySQL数据透视表

SELECT 
     temp_t.user_id, t1.Name, t1.Email, t1.Phone, temp_t.location_review, temp_t.condition_review, temp_t.price_review 
    FROM 
     table_1st t1 
     INNER JOIN 
     (SELECT 
      UserID as user_id, 
      MAX(IF(meta_key = 'location_review', meta_value, NULL)) AS location_review, 
      MAX(IF(meta_key = 'condition_review', meta_value, NULL)) AS condition_review, 
      MAX(IF(meta_key = 'price_review', meta_value, NULL)) AS price_review 
     FROM 
      table_2nd 
     GROUP BY UserID) temp_t 
      ON t1.ID = temp_t.user_id 
+0

有没有办法选择*像这样,还是我需要指定每个字段? –

+0

您可以在外部SELECT中使用SELECT *,这将给出table_1st的所有列和INNER SELECT查询的4列。但是,那么user_id将会是两次。 –

+0

我与这段代码非常接近。在phpmyadmin中,当我运行代码时,我有我想要显示的正确的col名称:)但值不是,它返回0行。所以这是朝正确方向迈出的一步,因为我现在有我需要的cols,我只需要获取数据/值就可以显示出来。 –