SQL: получить все сообщения с любыми комментариями - PullRequest
1 голос
/ 14 ноября 2008

Полагаю, мне нужно создать довольно простой SQL, но поскольку в наши дни я работаю с БД, я не могу выяснить детали.

У меня есть таблица 'posts' со следующими столбцами:

идентификатор, подпись, текст

и таблица «комментарии» со следующими столбцами:

идентификатор, имя, текст, post_id

Как будет выглядеть (одиночный) оператор SQL, который извлекает заголовки всех сообщений, с которыми связан один или несколько комментариев через ключ 'post_id'? СУБД - это MySQL, если она имеет какое-либо отношение к запросу SQL.

Ответы [ 7 ]

7 голосов
/ 14 ноября 2008
select p.caption, count(c.id)
from posts p join comments c on p.id = c.post_id
group by p.caption
having count (c.id) > 0
2 голосов
/ 14 ноября 2008
SELECT DISTINCT p.caption, p.id
    FROM posts p, 
         comments c 
    WHERE c.post_ID = p.ID 

Я думаю, что использование объединения будет намного быстрее, чем использование предложения IN или подзапроса.

0 голосов
/ 14 ноября 2008

Я считаю этот синтаксис наиболее читаемым в этой ситуации:

SELECT * FROM posts P 
  WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id)

Это выражает ваше намерение лучше, чем большинство других в этой теме - "дать мне все сообщения ..." (выберите * из сообщений) "... у которых есть какие-либо комментарии" (где есть (выберите * из комментариев) ...)) По сути, это то же самое, что и вышеописанные объединения, но поскольку вы на самом деле не выполняете объединение, вам не нужно беспокоиться о получении дубликатов записей в сообщениях, поэтому вы просто получите одну запись на сообщение.

0 голосов
/ 14 ноября 2008
SELECT DISTINCT caption
FROM posts
    INNER JOIN comments ON posts.id = comments.post_id

Забудьте о счетчиках и подзапросах.

Внутреннее объединение подберет все комментарии, которые имеют действительные сообщения, и исключит все сообщения, которые имеют 0 комментариев. DISTINCT объединит записи с дублирующими заголовками для сообщений, которые содержат более 1 комментария.

0 голосов
/ 14 ноября 2008

ВЫБРАТЬ подпись ИЗ сообщений INNER JOIN комментирует ON comments.post_id = posts.id GROUP BY posts.id;

Нет необходимости иметь предложение или считать ().

edit: Конечно, должно быть внутренним соединением (чтобы избежать нулевых значений, если комментарий потерян), благодаря jishi.

0 голосов
/ 14 ноября 2008

Просто схожу с моей головы, но, может быть, что-то вроде:

SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0)
0 голосов
/ 14 ноября 2008

Вы в основном смотрите на выполнение подзапроса -

SELECT p.caption FROM posts p WHERE (SELECT COUNT(*) FROM comments c WHERE c.post_id=p.id) > 1;

В результате запускается подзапрос SELECT COUNT(*) для каждой строки в таблице сообщений. В зависимости от размера ваших таблиц, вы можете рассмотреть возможность добавления дополнительного столбца, comment_count, в вашу таблицу posts для хранения номера соответствующего comments, так что вы можете просто сделать

SELECT p.caption FROM posts p WHERE comment_count > 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...