powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Хитрая выборка из трех таблиц, прошу помощи
4 сообщений из 4, страница 1 из 1
Хитрая выборка из трех таблиц, прошу помощи
    #39620061
olexsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица articles

Код: plaintext
1.
2.
3.
4.
id	title
1	Art_1
2	Art_2
3	Art_3
4	Art_4

Есть таблица location

Код: plaintext
1.
2.
3.
4.
5.
id	location
1	Украина
2	Россия
3	Япония
4	Киев
5	Чернигов

Есть таблица привязки статей к локации art2loc

Код: plaintext
1.
2.
3.
4.
5.
6.
id	loc_id	art_id
1	1	1
2	4	1
3	2	2
4	1	3
5	5	3
6	3	4

Задача: выбрать статьи, где нет локаций Украина и Россия. Тоесть с вышеуказанных данных должна выбраться только статья с id 4

Вот моя неверно работающая конструкция:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT  
  `a`.`id`,
  `a`.`title`,
FROM
  `articles` `a`
  LEFT OUTER JOIN `art2loc`  `b` ON (`a`.`id` = `b`.`art_id`)
  LEFT OUTER JOIN `location` `c` ON (`c`.`id` = `b`.`loc_id`)
WHERE
  `c`.`id` != 1 AND 
  `c`.`id` != 2
GROUP BY
  a.id
ORDER BY
  `a`.`id` DESC
LIMIT 9



Проблема возникает так как у одной статьи может быть указаны несколько локаций, к примеру Украина, Киев. И в мою выборку попадают статьи id 1 и 3 ((

Помогите плиз, так как моих познаний не хватает ((( Спасибо заранее!
...
Рейтинг: 0 / 0
Хитрая выборка из трех таблиц, прошу помощи
    #39620066
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
SELECT a.* 
FROM articles a
WHERE NOT EXISTS (SELECT NULL FROM art2loc l WHERE l.art_id=a.id AND l.loc_id IN (1,2))
...
Рейтинг: 0 / 0
Хитрая выборка из трех таблиц, прошу помощи
    #39620068
olexsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, интересная конструкция, ни в жисть такое бы не наваял ))) Спасибки, проверил — работает!

На другом форуме посоветовали такой код:

Код: sql
1.
2.
3.
SELECT a.*
FROM  `articles` a
WHERE  a.`id` NOT IN (SELECT `art_id` FROM `art2loc` WHERE `loc_id` IN (1,2))



Как по-вашему, какой код будет веселее справляться с таблицей `articles` в 200 тысяч строк и с миллионом строк в `art2loc` ?
...
Рейтинг: 0 / 0
Хитрая выборка из трех таблиц, прошу помощи
    #39620101
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olexsqlКак по-вашему, какой код будет веселее справляться с таблицей `articles` в 200 тысяч строк и с миллионом строк в `art2loc` ?Зависит, как минимум, от распределения данных и от версии MySQL.
На версиях до 5.7 конструкция IN (SELECT ...) работала очень медленно.

В целом мой вариант кажется более быстрым. Но надо пробовать. И, разумеется, должны быть созданы правильные индексы.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Хитрая выборка из трех таблиц, прошу помощи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]