2017-04-17 77 views
-1

我有一個查詢,我試圖讓另一個表內的每個用戶的值到結果中的一個輸出行。爲每個用戶連接MySQL查詢爲單行

SELECT DISTINCT table1.ID, table1.username, table1.display_name, 
       CASE WHEN table2.meta_key = 'vgm' THEN table2.meta_value END VGM, 
       CASE WHEN table2.meta_key = 'year_completed' THEN table2.meta_value END 'Year Completed', 
       CASE WHEN table2.meta_key = 'status' THEN table2.meta_value END Status, 
       CASE WHEN table2.meta_key = 'military_grade' THEN table2.meta_value END 'Military Grade' 
      FROM table1, table2 
      WHERE table1.ID = table2.user_id 

我最終得到的結果如下。如果可能的話,我希望所有的用戶信息都在一行中。任何人有任何建議?謝謝。

<table> 
 
<tr> 
 
<td>3</td> 
 
<td>user1</td> 
 
<td>Username Last</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
</tr> 
 
<tr> 
 
<td>3</td> 
 
<td>user1</td> 
 
<td>Username Last</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
<td>Baja</td> 
 
<td>NULL</td> 
 
</tr> 
 
<tr> 
 
<td>3</td> 
 
<td>user1</td> 
 
<td>Username Last</td> 
 
<td>NULL</td> 
 
<td>112</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
</tr> 
 
<tr> 
 
<td>3</td> 
 
<td>user1</td> 
 
<td>Username Last</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
<td>Subt</td> 
 
</tr> 
 
<tr> 
 
<td>3</td> 
 
<td>user1</td> 
 
<td>Username Last</td> 
 
<td>No</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
<td>NULL</td> 
 
</tr> 
 
</table>

表1是作爲這種:

<table> 
 
<tr> 
 
<td>ID</td> 
 
<td>NAME</td> 
 
<td>EMAIL</td> 
 
</tr> 
 
<tr> 
 
<td>3</td> 
 
<td>user1</td> 
 
<td>Username Last</td> 
 
</tr> 
 
<tr> 
 
<td>4</td> 
 
<td>user2</td> 
 
<td>Username2 Last2</td> 
 
</tr> 
 
</table>

表2是這樣:

<table> 
 
<tr> 
 
<td>ID</td> 
 
<td>USER_ID</td> 
 
<td>META_KEY</td> 
 
<td>META_VALUE</td> 
 
</tr> 
 
<tr> 
 
<td>1</td> 
 
<td>3</td> 
 
<td>Key 1</td> 
 
<td>Value 1</td> 
 
</tr> 
 
<tr> 
 
<td>1</td> 
 
<td>3</td> 
 
<td>Key 2</td> 
 
<td>Value 2</td> 
 
</tr> 
 
<tr> 
 
<td>1</td> 
 
<td>4</td> 
 
<td>Key 1</td> 
 
<td>Value 1</td> 
 
</tr> 
 
<tr> 
 
<td>1</td> 
 
<td>4</td> 
 
<td>Key 2</td> 
 
<td>Value 2</td> 
 
</tr> 
 
</table>

+1

我失去了一些東西在這裏?你的結果是不是已經排在一行? –

+0

如果您運行代碼snippit,則輸出對於一個用戶有4個不同的行。它應該只有一行,沒有NULL值。另一個表在它們自己的行上有多個值,我試圖將所有用戶信息壓縮到一個錶行中。 –

+0

我明白了,你可以請你發表table1和table2的表格模式和一些示例數據。我認爲這可以通過使用連接而不是從兩個表中解決。在提供新的查詢之前,我需要首先查看請求的信息。 –

回答

0

下面的查詢之間的主要區別和你的是我拿table2併爲每個meta_key子查詢,然後使用LEFT JOIN加入這些子查詢table1。這應該會爲每個用戶創建一條記錄。

你的表結構和查詢有一些不一致的地方,比如,table1user_namedisplay_name但是模式有NAMEEMAIL。我繼續使用您的查詢的字段名稱。

SQL查詢

SELECT 
    users.ID AS Id, 
    users.username AS UserName, 
    users.display_name AS DisplayName, 
    vgm.meta_value AS VGM, 
    year_completed.meta_value AS YearCompleted, 
    status.meta_value AS Status, 
    military_grade.meta_value AS MilitaryGrade 

-- Users -- 
FROM table1 AS users 

-- VGM -- 
LEFT JOIN (
    SELECT user_id, meta_key, meta_value 
    FROM table2 
    WHERE meta_key = 'vgm') 
AS vgm ON users.ID = vgm.user_id 

-- Year Completed -- 
LEFT JOIN (
    SELECT user_id, meta_key, meta_value 
    FROM table2 
    WHERE meta_key = 'year_completed') 
AS year_completed ON users.ID = year_completed.user_id 

-- Status -- 
LEFT JOIN (
    SELECT user_id, meta_key, meta_value 
    FROM table2 
    WHERE meta_key = 'status') 
AS status ON users.ID = status.user_id 

-- Military Grade -- 
LEFT JOIN (
    SELECT user_id, meta_key, meta_value 
    FROM table2 
    WHERE meta_key = 'military_grade') 
AS military_grade ON users.ID = status.user_id