powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
20 сообщений из 20, страница 1 из 1
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067705
pavlik201504
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть две таблицы.

Таблица 1: ID (цифра, первичный ключ), ...
Таблица 2: ID (цифра, первичный ключ), iTableID (цифра, индекс, ключ из таблицы 1), iStatus (цифра статуса)

Нужно сделать запрос к таблице 1 который вернёт все строки iID которых есть в колонке iTableID второй таблицы (хотя бы 1), при этом iStatus у второй таблицы должен быть равен 0.

Мой вариант:
SELECT * FROM Table1 WHERE (SELECT COUNT(*) FROM Table2 WHERE Table2.iTableID = Table1.iID AND Table2.iStatus = 0) > 0

Но этот код очень долго выполняется и сжирает очень много ресурсов (так как строк во второй таблице очень много). Пожалуйста, подскажите как его можно оптимизировать?
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067712
pavlik201504
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант SELECT * FROM Table1 WHERE Table1.iID IN (SELECT Table2.iTableID FROM Table2 WHERE Table2.iStatus = 0) тоже не подходит, долго выполняется
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067714
pavlik201504
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1).
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067716
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
distinct
не?
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067718
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavlik201504,

Код: sql
1.
2.
select * from t1
where exists (select 1 from t2 where t1.ID=t2.iTableID and t2.iStatus=0)


а если в t2 комбинация {iTableID,iStatus} уникальная, то лучше так
Код: sql
1.
2.
3.
select t1.*
from t1 inner join t2 on t1.ID=t2.iTableID
where t2.iStatus=0
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067719
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и индекс на t2.iTableID непомешает
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067730
pavlik201504
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Индекс есть, оба запроса выполняются слишком долго
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067755
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
distinct
???
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067757
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяdistinct
???

Вот причём тут distinct ???!

ТС, план показывай
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067759
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exists,вадяdistinct
???

Вот причём тут distinct ???!


Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1).
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067762
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяexists,пропущено...


Вот причём тут distinct ???!


Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1).
так тут автор условие пропустил просто WHERE Table2.iStatus = 0
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067765
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlik201504Вариант SELECT * FROM Table1 WHERE Table1.iID IN (SELECT Table2.iTableID FROM Table2 WHERE Table2.iStatus = 0) тоже не подходит, долго выполняетсяПерепиши на WHERE EXISTS
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067930
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlik201504Здравствуйте. Есть две таблицы.

Таблица 1: ID (цифра, первичный ключ), ...
Таблица 2: ID (цифра, первичный ключ), iTableID (цифра, индекс, ключ из таблицы 1), iStatus (цифра статуса)

Нужно сделать запрос к таблице 1 который вернёт все строки iID которых есть в колонке iTableID второй таблицы (хотя бы 1), при этом iStatus у второй таблицы должен быть равен 0.

Мой вариант:
SELECT * FROM Table1 WHERE (SELECT COUNT(*) FROM Table2 WHERE Table2.iTableID = Table1.iID AND Table2.iStatus = 0) > 0

Но этот код очень долго выполняется и сжирает очень много ресурсов (так как строк во второй таблице очень много). Пожалуйста, подскажите как его можно оптимизировать?

Вот самое простое и супербыстрое решение:

Код: sql
1.
2.
3.
4.
select * from a left join b 
    on a.id = b.id 
        && b.id is not null 
        && b.iStatus = 0
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39067933
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumixpavlik201504Здравствуйте. Есть две таблицы.

Таблица 1: ID (цифра, первичный ключ), ...
Таблица 2: ID (цифра, первичный ключ), iTableID (цифра, индекс, ключ из таблицы 1), iStatus (цифра статуса)

Нужно сделать запрос к таблице 1 который вернёт все строки iID которых есть в колонке iTableID второй таблицы (хотя бы 1), при этом iStatus у второй таблицы должен быть равен 0.

Мой вариант:
SELECT * FROM Table1 WHERE (SELECT COUNT(*) FROM Table2 WHERE Table2.iTableID = Table1.iID AND Table2.iStatus = 0) > 0

Но этот код очень долго выполняется и сжирает очень много ресурсов (так как строк во второй таблице очень много). Пожалуйста, подскажите как его можно оптимизировать?

Вот самое простое и супербыстрое решение:

Код: sql
1.
2.
3.
4.
select * from a left join b 
    on a.id = b.id 
        && b.id is not null 
        && b.iStatus = 0

не по ТЗ
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39068001
pavlik201504
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumix,

Супер! То что нужно! Спасибо!
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39068016
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlik201504Lumix,

Супер! То что нужно! Спасибо!Забавно. Вариант Lumix-а не отличается варианта выше ( 18231602 ). Ну разве что тем, что проверка iStatus = 0 забыта (о чем выше тоже говорилось). Но это все равно не препятствует появлению одинаковых записей в результате.
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39068053
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftpavlik201504Lumix,

Супер! То что нужно! Спасибо!Забавно. Вариант Lumix-а не отличается варианта выше ( 18231602 ).Отличается и ещё как :)
Последний вариант (на который ТС так проэрегировал) можно переписать ещё проще (ТС-у ж нужны данные только из Table1, верно?)
Код: sql
1.
SELECT * FROM Table1




LumixВот самое простое и супербыстрое решение:

Код: sql
1.
2.
3.
4.
select * from a left join b 
    on a.id = b.id 
        && b.id is not null 
        && b.iStatus = 0


Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ?
Поинтересуйся, это интересно :)
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39068055
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exists,Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ?
Поинтересуйся, это интересно :)А ты поинтересуйся, что происходит с OUTER JOIN-ом, если необязательную сторону (в данном случае поле из таблицы b) проверять на равенство с константой.
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39068057
exists,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftexists,Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ?
Поинтересуйся, это интересно :)А ты поинтересуйся, что происходит с OUTER JOIN-ом, если необязательную сторону (в данном случае поле из таблицы b) проверять на равенство с константой.если в where - то он становится inner. Но тут НЕ where !!
...
Рейтинг: 0 / 0
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
    #39068060
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exists,если в where - то он становится inner. Но тут НЕ where !!Да, тут моя промашка. Я на автомате посчитал что куча условий - это WHERE.

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


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