Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Помогите составить запрос
Razzwan  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Землянин
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 622
Пользователь №: 40774
На форуме: 1 год, 10 месяцев, 19 дней
Карма: 10




Есть новость и категория новости. Новость может принадлежать нескольким категориям, а может быть вообще без категорий. Все это в 3нф. Нужно выбрать все новости, которые не принадлежат категории с cat_id=5 (если новость принадлежит двум категориям, например, 2 и 5 - ее не выбираем). Одним SQL запросом.

Логику я понимаю, но чет до конца додумать не могу.

3н.ф. говорит о том, что у меня есть 3 таблицы: новости, категории, и таблица связи. Мне нужно выбрать все новости, которые в таблице связи не встречаются с cat_id=5

SELECT * 
FROM news
LEFT JOIN news_cats
ON news.id = news_cats.news_id
WHERE news_cats.cat_id<>5
UNION
SELECT
*
FROM news
LEFT JOIN news_cats
ON news.id = news_cats.news_id
WHERE news_cats.cat_id IS null


Во-первых, такой запрос выберет те новости, которые принадлежат двум категориям, одна из которых = 5, а во-вторых сам запрос кажется громоздким. Такое впечатление, что можно проще. DISTINCT не знаю, как можно здесь использовать и можно ли. (

Это задание в тесте, которое я не решил (


--------------------
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14966
Пользователь №: 4190
На форуме: 8 лет, 9 месяцев, 27 дней
Карма: 443




"На коленке" набросал так :) Скорее всего не самый оптимальный вариант, но должен работать.
Тут я предполагаю, что news - это таблица новостей, а news_cats - таблица связей между новостями и категориями.
select * 
from news
where news_id not in
(select distinct news_id
from news_cats
where cat_id = 5
)


Это сообщение отредактировал sergeiss - 20.11.2015 - 21:23


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
WebWizardry  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









select n.* from news2cats nc
left join news2cats nc2 on nc2.news_id = nc.news_id and nc2.cat_id = 5
left join news n on n.id = nc.news_id
where nc2.news_id is null
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
WebWizardry  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









да, еще group by n.id
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса