Помощь со сложными условиями соединения

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'

Например, этот запрос возвращает одну строку, где Strength is 2. В идеале у меня может быть один столбец для нейронов .id, один для нейронов.имя и один для SUM (synapses.strength) с одной записью для каждого отличный нейрон.

Теги:
join
database-design

2 ответа

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, КАК "% ice%" ... sql Майка занял 0,0218 с. Код Пони занял 0,0007 с. Почему этот запрос намного быстрее?
  • 0
    @ Adam: Вероятно, связано с другим синтаксисом (заменено ИЛИ для предложения IN). Кроме того, меньше критериев для группировки по сумме.
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, на предмет правильного синтаксиса для использования рядом с INNER JOIN synapses ON neurons.id = synapses.n1_id ИЛИ neurons.id = synapses.n2_i 'в строке 3
  • 0
    исправлено? :) Я просто должен был удалить несколько запятых
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню