2011-11-16 13 views
1

我知道在SQL中計算稀疏點產品很容易,但是對於很長的向量來說,最好的方法是什麼?SQL中長向量的總和

一個連接是不夠的,因爲如果一個座標被填充到一個矢量中而不是另一箇中,它將被忽略。

因此,我計算了一個PHP循環的總和...這是一個非常愚蠢的想法。

我目前正在考慮填充缺少的0爲了準備一個內部連接,但有沒有一個快捷方式(如外部連接將NULL轉換爲0)?

編輯。這裏是我的矢量表的結構:

CREATE TABLE `eigaki_vectors` (
    `name` varchar(2) COLLATE utf8_unicode_ci NOT NULL, 
    `i1` int(10) NOT NULL, 
    `i2` int(10) NOT NULL, 
    `value` double NOT NULL, 
    UNIQUE KEY `key` (`name`,`i1`,`i2`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

在這種特殊情況下,一個向量組成了指數:v_{i_1, i_2},但這無關的問題。

我希望做這樣的事情(感謝xQbert):

SELECT v1.i1, v1.i2, isNull(v1.value, 0) + isNull(v2.value, 0) 
FROM eigaki_vectors v1 FULL OUTER JOIN eigaki_vectors v2 
ON v1.i1 = v2.i1 AND v1.i2 = v2.i2 
AND v1.name = 'a' AND v2.name = 'b' 

添加矢量ab。但是FULL OUTER JOIN在MySQL上不存在,我認爲我對name列很笨拙。有任何想法嗎?

+0

你能否提供一個e所涉及的表格的xample以及您試圖執行的查詢的粗略草圖? –

+0

這是。謝謝! –

回答

1

我得到了一些東西,感謝MySQL: Union of a Left Join with a Right Join提供的代碼片段:

SELECT IFNULL(v1.value, 0) + IFNULL(v2.value, 0) FROM 
(
    SELECT i1, i2 FROM eigaki_vectors WHERE name = 'a' 
    UNION 
    SELECT i1, i2 FROM eigaki_vectors WHERE name = 'b' 
) indices 
LEFT OUTER JOIN eigaki_vectors v1 ON indices.i1 = v1.i1 AND indices.i2 = v1.i2 AND v1.name = 'a' 
LEFT OUTER JOIN eigaki_vectors v2 ON indices.i1 = v2.i1 AND indices.i2 = v2.i2 AND v2.name = 'b' 
1
coalesce(Field,OtherField, AnotherField,0) 

聚結基本上是如果那麼永遠...它從你的變量

的isNull做同樣的事情,但只有2個值列表中選取的第一個非空值

isNull(Field,0) 
+0

謝謝。等價的MySQL似乎是IFNULL(如果expr爲NULL,ISNULL(expr)只返回1,否則返回0)。 –

+0

對不起:(我想念閱讀文章 – xQbert