将来自多个MySql表的数据(多行)组合成一行用于SELECT语句

时间:2017-07-18 08:45:37

标签: php mysql

注意:这不是重复:mySQL - Create a New Table Using Data and Columns from Three Tables。这个问题是关于从多个表中获取数据并实际创建包含该数据的新表。我只是想选择已有的数据。关于这个问题的答案非常具体针对所提出的问题,并且由于答案中的代码没有得到解释,因此对我没有帮助。所以不,这根本不是“完全相同的问题”。

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

所以我有这样的第一个表(为了示例目的简化了表格):

ID    Name    Email               Phone
1     John    john@example.com    000-123-4567
2     Jane    jane@example.com    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    john@example.com    000-123-4567   4                  1                   5
    2     Jane    jane@example.com    000-890-1234   4                  2                   4

所以我需要将Table2中具有UserID的行添加到Table1中的数据中。

由于这是现有的软件,已经有一些代码可以加入这两个表,它就在这里:

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 
    )

我正在做的是:以前只有一个“评级”值,存储在元表中。您可以在上面的Join中看到它:

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

1 个答案:

答案 0 :(得分: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