2014-10-01 28 views
0

我有一個表ce_relations和一個表ce_values,我想將它與表ce_combined_values結合使用。 ce_combined_values表應該與ce_relations具有完全相同的行數。但是,下面所述的查詢不會返回ce_values.user_id列中user_id和friend_id存在的行。我試圖通過使用IFNULL語句來解決這個問題,但我想在WHERE clausule中還缺少一個額外的條件......歡迎任何幫助!如果表列中沒有重疊,則使用標準值

INSERT INTO ce_combined_values (user_id, friend_id, relation_degree, user_value, friend_value, relation_value) 
SELECT a.user_id, a.friend_id, a.relation_degree, IFNULL(b.1d_value, 0) as user_value, IFNULL(c.1d_value, 0) as friend_value, Least(b.1d_value, c.1d_value) as relation_value 
FROM ce_relations a, ce_values b, ce_values c 
WHERE a.relation_degree = 1 AND b.user_id = a.user_id AND c.user_id = a.friend_id AND b.user_id <> c.user_id 

Union all 

//same select query is used for relation_degree 2 with 2d_values and relation_degree 3 with 3d_values. 

編輯:

例如,這是我想達到的目標:

表ce_relations:

+---------+-----------+-----------------+ 
| user_id | friend_id | relation_degree | 
+---------+-----------+-----------------+ 
|  1 |   3 |    1 | 
|  2 |   1 |    1 | 
|  3 |   4 |    1 | 
+---------+-----------+-----------------+ 

表ce_values:

+---------+----------+----------+----------+ 
| user_id | 1d_value | 2d_value | 3d_value | 
+---------+----------+----------+----------+ 
|  1 |  5 |  10 |  33 | 
|  2 |  10 |  12 |  44 | 
|  3 |  20 |  13 |  55 | 
+---------+----------+----------+----------+ 

應該成爲ce_combi斯內德值(刪除relation_degree和relation_value的可讀性)

+---------+-----------+------------+--------------+ 
| user_id | friend_id | user_value | friend_value | 
+---------+-----------+------------+--------------+ 
|  1 |   3 |   5 |   20 | 
|  2 |   1 |   10 |   5 | 
|  3 |   4 |   20 |   0 | 
+---------+-----------+------------+--------------+ 

,但目前返回

+---------+-----------+------------+--------------+ 
| user_id | friend_id | user_value | friend_value | 
+---------+-----------+------------+--------------+ 
|  1 |   3 |   5 |   20 | 
|  2 |   1 |   10 |   5 | 
+---------+-----------+------------+--------------+ 
+0

的ce_combined_values表應具有行作爲ce_relations完全相同的量。但是,下面所述的查詢不會返回ce_values.user_id列中存在user_id和friend_id的行--- 不清楚您嘗試實現的內容。你能給個例子嗎? – SouravA 2014-10-01 13:32:37

+0

目前尚不清楚你需要輸出什麼。如果您使用的是「UNION ALL」,則輸出將是第一個表中的行數+下一個表中的行數。 – 2014-10-01 13:38:28

+0

我不確定,但聽起來好像你想要一個'左連接' – 2014-10-01 13:38:39

回答

0

(與friend_id = 4缺少,因爲它不存在ce_values行),如果我理解你的問題正確地說,你需要LEFT JOIN你的表格。我不認爲你需要聯合所有相同的查詢三次只是一個不同的過濾條件。

也許這可以幫助你:

SELECT a.user_id, a.friend_id, a.relation_degree, 
     IFNULL(b.value, 0) as user_value, 
     IFNULL(c.value, 0) as friend_value, 
     Least(b.value, c.value) as relation_value 
    FROM ce_relations a 
    LEFT 
    JOIN ce_values b 
    ON a.user_id = b.user_id 
    LEFT 
    JOIN ce_values c 
    ON a.friend_id = c.user_id 
    AND b.user_id <> c.user_id 
WHERE a.relation_degree IN (1, 2, 3) 
+0

感謝您的快速響應!不幸的是我並不完全清楚。左連接不會幫助,因爲我需要來自不同列的每個關係度的值。度數爲1的ce_values.1d_value,度數爲2的ce_values.2d_value和度數爲3的ce_values.3d_value – Florian 2014-10-01 14:00:50

+0

但是,我可以爲每個度數執行一次左連接,然後合併它們...我現在正在工作。感謝你的臉! – Florian 2014-10-01 14:49:28

相關問題