2014-07-16 6 views
0

Так что я простая таблица, что я учусь SQL на, уже сконфигурирована:Как отфильтровать таблицу и присоединиться результаты (SQL)

count(docnum, text, num) 

Где отсчет имя таблицы, Docnum является уникальным номер документа, текст - это слово, а num - количество вхождений этого слова в документе с номером docnum.

Я пытаюсь создать запрос, который возвращает количество уникальных документов, содержащих два слова «Hello» и «World» (т. Е. Text = «Hello» и text = «World»). Я написал следующий запрос, используя ПЕРЕСЕЧЕНИЕ, но у меня возникли проблемы со зрением, как сделать это с простым JOIN:

SELECT COUNT(*) FROM (
SELECT docnum d 
FROM count 
Where text="Hello" 
INTERSECT 
SELECT docnum e 
FROM count 
where text="World" 
) x; 

Это работает, но я не могу видеть, как сделать это с помощью объединения. Любая помощь будет оценена по достоинству.

+0

Пожалуйста, не используйте ключевые слова sql в качестве имен таблиц. Это заставляет взрослого человека плакать. – wvdz

ответ

0

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

select count(*) 
from 
(
    select docnum 
    from `count` 
    where `text` in ('Hello', 'World') 
    group by docnum 
    having count(distinct `text`) = 2 
) x 
+0

Вам не нужен подвыбор – Hogan

0

Вот с объединением

SELECT count(*) 
FROM `count` a 
JOIN `count` b ON a.docnum = b.docnum 
WHERE a.text='Hello' AND b.text='World' 

Вот еще один способ (наконечник шляпы Юргена d)

SELECT count(distinct docnum) 
FROM `count` 
WHERE `text` IN ('Hello','World') 
group by docnum 
having count(distinct `text`) = 2 
+0

Второй запрос возвращает документы, имеющие только одно из слов –

+0

@juergend - хороший момент .. вот почему он будет быстрым – Hogan

+0

И вернем неправильные результаты. –

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