Предложение SQL, где идентификатор существует X раз в альтернативной таблице - PullRequest
1 голос
/ 22 июня 2011

Я попытался создать запрос SQL, который выбирает только строки из database1.documents, у которых doc_id равно 'id', которое появляется менее 3 раз в database2.documents.

Database2.documents использует внешний идентификатор (database2.documents.doc_id = database1.documents.id).

Я сократил свой запрос до базовой концепции:

SELECT database1.documents.id, database1.documents.title, database1.documents.date
  FROM database1.documents
 WHERE COUNT (database1.documents.id = database2.documents.doc_id) < 3

Вот пример желаемого результата:

+---------------------------+
| Database 1: 'documents'   |
|---------------------------|
| id | title   | date       |
|----+---------+------------|
|  1 | Title 1 | 01/01/2011 |
|  2 | Title 2 | 02/01/2011 |
|  3 | Title 3 | 03/01/2011 |
+---------------------------+
+---------------------------+
| Database 2: 'documents'   |
|---------------------------|
| id | doc_id | date        |
|----+--------+-------------|
|  1 | 2      | 01/01/2011  |
|  2 | 3      | 02/01/2011  |
|  3 | 2      | 03/01/2011  |
|  4 | 2      | 04/01/2011  |
+---------------------------+
+---------------------------+
| Result                    |
|---------------------------|
| id | title   | date       |
|----+---------+------------|
|  1 | Title 1 | 01/01/2011 |
|  3 | Title 3 | 03/01/2011 |
+---------------------------+

Это не работает, какмне идти к достижению этого?Слово руководства будет наиболее ценно, спасибо.: 3

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Условие, основанное на агрегатных функциях, должно быть указано в HAVING, а не в WHERE предложении:

SELECT d1.id, d1.title, d1.date, COUNT(*)
FROM database1.documents d1
LEFT JOIN database2.documents d2 ON (d1.id = d2.doc_id)
GROUP BY d1.id, d1.title, d1.date 
HAVING COUNT(*) < 3

Другой альтернативой является использование производных запросов, как это было предложено другими

0 голосов
/ 22 июня 2011

Попробуйте это:

SELECT *
  FROM database1.documents a LEFT JOIN 
       (
         SELECT  doc_id, COUNT(1) cnt_docs
           FROM  database2.documents 
          GROUP BY   doc_id
       ) b
    ON a.id = b.doc_id 
   AND b.cnt_docs < 3
0 голосов
/ 22 июня 2011
--  here's how to get the docid's from d2 that happen 3 times.

select *
from database1.document d1,
(
select count(*), d2.documentid
from database2.document d2
group by d2.documentid
having count(*) >= 3
) ds2
where ds2.documentid = d1.documentid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...