2010-12-09 1 views
1

Я хотел бы переформатировать таблицу MySql для использования в программе сопоставления сетевых узлов. Оригинальный формат:Запрос MySql для получения всех комбинаций элементов в одном и том же поле таблицы

| ID | story | org | scribe | 

, и я хотел бы вывести все орг имен на два выходных таблицы, как это:

| org1 | org2 | scribe | weight of connection | 

org1 и org2 оба из того же поля в исходной таблице, и связаны друг с другом путем обмена одним или несколькими книжниками. У всех книжников есть уникальные идентификаторы. И, конечно, я не хочу дублировать записи.

Что я CAN до сих пор вытаскивает все организации, которые подключены к какой-либо одной организации в списке, выполнив поиск% org% для организации и затем исключая эту организацию из вывода, например :

SELECT 'tabitha' as org1, 
org as org2, 
teller as scribe_id, 
count(teller) as weight 
FROM `stories` 
WHERE teller in 
(
(SELECT 
teller 
FROM `stories` 
WHERE org like '%tabitha%' 
group by teller) 
) 
and org not like '%tabitha%' 
group by teller, org 

Так что я чувствую, что есть какой-то подвох о Самосоединении или случая, когда это может работать, но я не нашел ничего еще.

+0

Спасибо за ответ, который сработал, с небольшим количеством настроек. –

ответ

0

Я не совсем понимаю, что вы пытаетесь сделать, но возможно что-то вроде этого?

select t1.org as org1, t2.org as org2, teller as scrib_id, count(teller) as weight 
from stories t1 join stories t2 where t1.teller=t2.teller and t1.org!=t2.org 
group by teller,t1.org 

Это будет выполнять соединение между t1 и t2 (как та же таблица) на кассира, она исключает записи, которые присоединяются к себе

я мог быть далеко, но, возможно, какой-то вариант объединения синтаксис может помочь.

+0

Ницца! Я никогда раньше не использовал два условия для присоединения, но должен помнить, что он работает здесь. Самый близкий беспорядок в соединении, который я сделал, - это формула для получения кумулятивных распределений. Я выложу окончательный запрос ниже: выберите t1.org в org1, t2.org в org2, t1.teller как scrib_id, граф (отличный t1.story) как вес из историй t1 t2 присоединиться рассказы где t1.teller = t2.teller и t1.org! = t2.org и t1.org не в ('none', '[swahili]', '[]') и t2.org не в ('none' , '[суахили]', '[]') группа по t1.teller, t1.org порядковый номер desc, t1.org; –

0

Этот запрос работал. Только настройка из приведенного решения заключалась в том, что он не правильно вычислял весы.

select t1.org as org1, 
     t2.org as org2, 
     t1.teller as scrib_id, 
     count(distinct t1.story) as weight 
     /* need to count the stories instead of the scribes now */  
from stories t1 join stories t2 
where t1.teller=t2.teller 
    and t1.org!=t2.org and t1.org not in ('none','[swahili]','[]') 
    /* this just excludes nonsense categories */ 
    and t2.org not in ('none','[swahili]','[]') 
group by t1.teller,t1.org 
order by weight desc, t1.org; 

На мой следующий вопрос - я даже не знаю, если это возможно, вы можете задать SQL сделать приблизительную матч на кассовой или писца? Если эти идентификаторы являются номерами телефонов, и кто-то забывает одну из цифр, я все равно хотел бы сгруппировать их вместе. Я предполагаю, что это слишком сложно для mysql - мне нужен питон или что-то в этом роде.

Смежные вопросы