У меня есть следующая 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) с одной записью для каждого отдельного нейрона.
Этот запрос быстрее. Я попробовал оба с добавленным WHERE context.keyword LIKE '% ice%' ... Mike's sql занял 0.0218 с. Код Ponies занял 0.0007 сек. Почему этот запрос намного быстрее? – Adam
@Adam: Вероятно, имеет отношение к другому синтаксису (поменяется ИЛИ для предложения IN). Кроме того, меньше критериев для группировки на сумму. –