2017-07-18 72 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,我只需要獲取數據/值就可以顯示出來。 –