2010-09-16 61 views
0

我有以下MySQL表架構:幫助複雜的連接條件

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

-- 
-- Database: `network` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `contexts` 
-- 

CREATE TABLE IF NOT EXISTS `contexts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `keyword` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `neurons` 
-- 

CREATE TABLE IF NOT EXISTS `neurons` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `synapses` 
-- 

CREATE TABLE IF NOT EXISTS `synapses` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `n1_id` int(11) NOT NULL, 
    `n2_id` int(11) NOT NULL, 
    `context_id` int(11) NOT NULL, 
    `strength` double NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

我能寫什麼SQL來獲得與指定的上下文中有實力列與相關聯的突觸的總和沿着相關聯的所有神經元每個神經元?

我正在使用以下查詢,它返回與一個神經元相關聯的突觸強度的總和。我需要得到信息,所有的神經元:

/* This query finds how strongly the neuron with id 1 is connected to the context with keyword ice cream*/ 

SELECT SUM(strength) AS Strength FROM 
synapses 
JOIN contexts AS Context ON synapses.context_id = Context.id 
JOIN neurons AS Neuron ON Neuron.id = synapses.n1_id OR Neuron.id = synapses.n2_id 
WHERE Neuron.id = 1 AND Context.keyword = 'ice cream' 

例如,該查詢返回一行,其中強度是2。理想情況下,我可能對neurons.id爲neurons.name一列,一個,一個用於SUM(synapses.strength),每個不同神經元具有一個記錄。

回答

1

用途:

SELECT DISTINCT 
      n.*, 
      COALESCE(x.strength, 0) AS strength 
    FROM NEURONS n 
    JOIN SYNAPSES s ON n.id IN (s.n1_id, s.n2_id) 
    JOIN CONTEXTS c ON c.id = s.context_id 
LEFT JOIN (SELECT c.id AS c_id, 
        n.id AS n_id, 
        SUM(strength) AS Strength 
      FROM SYNAPSES s 
      JOIN CONTEXTS c ON c.id = s.context_id 
      JOIN NEURONS n ON n.id IN (s.n1_id, s.n2_id) 
     GROUP BY c.id, n.id) x ON x.c_id = c.id 
           AND x.n_id = n.id 
+0

這個查詢是更快。我試着用一個添加的WHERE context.keyword LIKE'%ice%'... Mike的SQL花了0.0218秒。小馬的代碼花了0.0007秒。爲什麼這個查詢要快得多? – Adam 2010-09-16 16:23:38

+0

@Adam:可能與不同的語法有關(換出或換一個IN子句)。另外,對於總和而言,組合的標準更少。 – 2010-09-16 16:27:28

1

這是做你想做的嗎?

SELECT contexts.keyword, neurons.id, neurons.name, SUM(synapses.strength) 
FROM neurons 
INNER JOIN synapses ON neurons.id = synapses.n1_id OR neurons.id = synapses.n2_id 
INNER JOIN contexts ON synapses.context_id = contexts.id 
GROUP BY contexts.keyword, neurons.id, neurons.name 
+0

我得到以下錯誤:#1064 - 你在你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第3行的INNER JOIN突觸ON神經元.id = synapses.n1_id或neurons.id = synapses.n2_i'附近使用正確的語法。 – Adam 2010-09-16 16:12:05

+0

fixed? :)我只需要刪除一些逗號 – 2010-09-16 16:14:09

+0

不錯的工作 - 我不得不在兩個位置上下文環境變化,但效果很好。謝謝,邁克。 +1。 – Adam 2010-09-16 16:16:13