Как я могу добавить соединение к этому громоздкому оператору объединения SQL? - PullRequest
0 голосов
/ 28 февраля 2011

У меня есть оператор, который ранжирует элементы на основе количества общих тегов и ораторов на основе связывания таблиц, но я хочу, чтобы он также мог извлекать информацию talk_title и talk_brief из основного tbl_talks, которого на самом деле нет в запросе прямо сейчас (используются только таблицы ссылок). в основном таблицы связывания имеют talk_id и tag_id или talk_id и speaker_id.

Я попробовал несколько способов попытаться ВЛЕВО СОЕДИНИТЬСЯ или добавить tbl_talks в парные SELECT, к которым применяется объединение, но безуспешно. Мне нужно связать как tbl_linking_talk_tag.talk_id, так и tbl_linking_speakers_talk с tbl_talks.talk_id и, с этим, взять talk_title и talk_brief из tbl_talks

SELECT talk_id, count(*) AS common_term_count FROM 
      (
      SELECT talk_id FROM tbl_linking_talk_tag WHERE tag_id IN 
         (SELECT tag_id FROM tbl_linking_talk_tag WHERE talk_id = 1)
      UNION ALL 
      SELECT talk_id FROM tbl_linking_speakers_talk WHERE speaker_id IN
         (SELECT speaker_id FROM tbl_linking_speakers_talk WHERE talk_id = 1)
       ) AS accumulator_table

 WHERE talk_id != 1 

 GROUP BY talk_id

 ORDER BY common_term_count DESC

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Не думайте, что вам нужен союз в этом случае.Если все, что вам нужно, это считать, то почему бы не попробовать что-то вроде ..

SELECT talk_id, (SELECT count (*) FROM tbl_linking_talk_tag sub WHERE tag_id IN (SELECT tag_id FROM tbl_linking_talk_tag WHERE talk_id = 1) и maintalk.talk_id =sub.talk_id) + (SELECT count (*) FROM tbl_linking_speakers_talk sub1 WHERE speaker_id IN (SELECT speaker_id FROM tbl_linking_speakers_talk WHERE talk_id = 1) и и maintalk.talk_id = sub1.talk_id ma, talk_trief_id из группы Говоритеtalk_id

Синтаксис может нуждаться в некотором исправлении, но подход состоит в том, чтобы

выбрать столбцы из maintable

0 голосов
/ 28 февраля 2011

Я понял, работает с этим кодом:

 SELECT a.talk_id, a.talk_image, a.talk_title, a.talk_brief, count(b.talk_id)  AS common_term_count 
        FROM tbl_talks a LEFT OUTER JOIN
             (
             SELECT talk_id FROM tbl_linking_talk_tag WHERE tag_id IN 
                (SELECT tag_id FROM tbl_linking_talk_tag WHERE talk_id = 1)
             UNION ALL 
             SELECT talk_id FROM tbl_linking_speakers_talk WHERE speaker_id IN
                (SELECT speaker_id FROM tbl_linking_speakers_talk WHERE talk_id = 1) 
             ) AS b
             ON a.talk_id = b.talk_id       
        WHERE a.talk_id != 1        
        GROUP BY b.talk_id      
        ORDER BY common_term_count DESC
...