Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
Mikha38
Member

Откуда:
Сообщений: 5
Приветствую!
Дано:
1) Таблица№1 100noun. столбцы eng, rus.
2) Таблица№2 user_vocabular столбцы eng, rus, engtorus, user_id

Найти:
Выборка всех строк из 100noun, кроме тех где 100noun.eng = user_vocabular.eng AND user_vocabular.engtorus = 1 AND user_vocabular.user_id = 1

Я додумался только до этого, но тут результат в точности противоположный, что мне нужен. По сути мне нужно получить все строки из 100noun кроме тех, что в выборке ниже:
"SELECT * FROM 100noun, user_vocabular WHERE 100noun.eng = user_vocabular.eng AND user_vocabular.engtorus = 1 AND user_vocabular.user_id = 1"

Или совсем простым языком надо так:
"SELECT * FROM 100noun(строки только из этой таблицы) КРОМЕ 100noun.eng = user_vocabular.eng AND user_vocabular.engtorus = 1 AND user_vocabular.user_id = 1"

Сообщение было отредактировано: 13 фев 20, 15:54
13 фев 20, 15:52    [22079358]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20009
Покажите лучше пример - исходные данные и результат (и чтобы каждое условие хоть раз "стрельнуло"). Ещё лучше - создайте fiddle и дайте для него требуемый результат.
13 фев 20, 16:53    [22079432]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
entrypoint
Member

Откуда:
Сообщений: 227
-- I вариант
SELECT `100noun`.eng FROM
(
SELECT 1 AS eng UNION ALL
SELECT 1 AS eng UNION ALL
SELECT 3 AS eng UNION ALL
SELECT 4 AS eng
) AS `100noun`
LEFT JOIN
(
SELECT 1 AS eng, 1 AS engtorus, 1 AS user_id UNION ALL
SELECT 1 AS eng, 0 AS engtorus, 2 AS user_id UNION ALL
SELECT 2 AS eng, 1 AS engtorus, 3 AS user_id UNION ALL
SELECT 3 AS eng, 2 AS engtorus, 4 AS user_id
) AS user_vocabular
ON `100noun`.eng = user_vocabular.eng AND user_vocabular.engtorus = 1 AND user_vocabular.user_id = 1
WHERE user_vocabular.eng IS NULL;

-- II вариант
SELECT `100noun`.eng FROM
(
SELECT 1 AS eng UNION ALL
SELECT 1 AS eng UNION ALL
SELECT 3 AS eng UNION ALL
SELECT 4 AS eng
) AS `100noun`
WHERE NOT EXISTS (SELECT 1 FROM
(
SELECT 1 AS eng, 1 AS engtorus, 1 AS user_id UNION ALL
SELECT 1 AS eng, 0 AS engtorus, 2 AS user_id UNION ALL
SELECT 2 AS eng, 1 AS engtorus, 3 AS user_id UNION ALL
SELECT 3 AS eng, 2 AS engtorus, 4 AS user_id
) AS user_vocabular
WHERE `100noun`.eng = user_vocabular.eng AND user_vocabular.engtorus = 1 AND user_vocabular.user_id = 1
);
13 фев 20, 18:11    [22079488]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
Mikha38
Member

Откуда:
Сообщений: 5
Ну или я чёт не въезжаю, ну короче не работает так.

В приложении указаны таблицы со строками.
Красным шрифтом выделено то, что нужно получить в результате выборки. На жёлтом фоне те значения которые отсеиваются.

Я решил части проблему таким запросом:
("SELECT * FROM 100noun LEFT OUTER JOIN user_vocabular ON 100noun.eng = user_vocabular.eng WHERE user_vocabular.engtorus IS NULL");
Но у меня изначально значения 0 и 1, можно переделать бд где 0 заменить на NULL, но в душе свербит, что я как программист пошёл по легкому пути говнокода.

А такая строка не работает: и ХЗ по чему, с NULL работает, а с INT вот те нате уже нет!
("SELECT * FROM 100noun LEFT OUTER JOIN user_vocabular ON 100noun.eng = user_vocabular.eng WHERE user_vocabular.engtorus = '1'");

К сообщению приложен файл. Размер - 15Kb
14 фев 20, 00:11    [22079668]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
Mikha38
Member

Откуда:
Сообщений: 5
Финальная выборка из приложеной картинки xxx2,xxx4,xxx5,xxx6,xxx7,xxx8,xxx9

(нет xxx1 и xxx3 потому что в таблице user_vocabular в строках с такими значениями, в столбце engtorus значения = 1(Единица)

Сообщение было отредактировано: 14 фев 20, 00:28
14 фев 20, 00:27    [22079673]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
Mikha38
Member

Откуда:
Сообщений: 5
1

Сообщение было отредактировано: 14 фев 20, 00:28
14 фев 20, 00:28    [22079674]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
miksoft
Member

Откуда:
Сообщений: 37995
Mikha38
WHERE user_vocabular.engtorus IS NULL
Вы не то поле на NULL проверяете.
14 фев 20, 08:24    [22079724]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
Mikha38
Member

Откуда:
Сообщений: 5
Как не то то?)) Ты видимо не понял условия задачи, вначале поста посмотри. Ну или напиши конкретное названия поля. Ну давайте ребзя, ещё вариантики поднакидайте, у меня сегодня ДР!)

Сообщение было отредактировано: 14 фев 20, 13:00
14 фев 20, 13:01    [22079944]     Ответить | Цитировать Сообщить модератору
 Re: Выборка * из таблицы1, кроме тех строк, которые есть таблице2  [new]
miksoft
Member

Откуда:
Сообщений: 37995
entrypoint
ON `100noun`.eng = user_vocabular.eng AND user_vocabular.engtorus = 1 AND user_vocabular.user_id = 1
WHERE user_vocabular.eng IS NULL;
Mikha38
ON 100noun.eng = user_vocabular.eng WHERE user_vocabular.engtorus IS NULL
Коллега entrypoint предлагает проверять то поле, по которому идет соединение - user_vocabular.eng, что правильно. Оно будет NULL только тогда, когда в правой таблице не нашлось подходящей записи.
А вы проверяете почему-то user_vocabular.engtorus.
14 фев 20, 19:41    [22080345]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить