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

Таблица 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
03.10.2015, 20:34:43
    #39067712
pavlik201504
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
Вариант SELECT * FROM Table1 WHERE Table1.iID IN (SELECT Table2.iTableID FROM Table2 WHERE Table2.iStatus = 0) тоже не подходит, долго выполняется
...
Рейтинг: 0 / 0
03.10.2015, 20:43:55
    #39067714
pavlik201504
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1).
...
Рейтинг: 0 / 0
03.10.2015, 20:47:40
    #39067716
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
distinct
не?
...
Рейтинг: 0 / 0
03.10.2015, 20:58:43
    #39067718
exists,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
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
03.10.2015, 21:00:02
    #39067719
exists,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
и индекс на t2.iTableID непомешает
...
Рейтинг: 0 / 0
03.10.2015, 21:43:26
    #39067730
pavlik201504
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
Индекс есть, оба запроса выполняются слишком долго
...
Рейтинг: 0 / 0
03.10.2015, 22:46:31
    #39067755
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
distinct
???
...
Рейтинг: 0 / 0
03.10.2015, 22:53:41
    #39067757
exists,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
вадяdistinct
???

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

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

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


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


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


Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1).
так тут автор условие пропустил просто WHERE Table2.iStatus = 0
...
Рейтинг: 0 / 0
03.10.2015, 23:17:13
    #39067765
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
pavlik201504Вариант SELECT * FROM Table1 WHERE Table1.iID IN (SELECT Table2.iTableID FROM Table2 WHERE Table2.iStatus = 0) тоже не подходит, долго выполняетсяПерепиши на WHERE EXISTS
...
Рейтинг: 0 / 0
04.10.2015, 19:08:52
    #39067930
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
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
04.10.2015, 19:13:18
    #39067933
exists,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
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
04.10.2015, 23:06:36
    #39068001
pavlik201504
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
Lumix,

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

Супер! То что нужно! Спасибо!Забавно. Вариант Lumix-а не отличается варианта выше ( 18231602 ). Ну разве что тем, что проверка iStatus = 0 забыта (о чем выше тоже говорилось). Но это все равно не препятствует появлению одинаковых записей в результате.
...
Рейтинг: 0 / 0
05.10.2015, 07:09:05
    #39068053
exists,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
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
05.10.2015, 07:17:22
    #39068055
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
exists,Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ?
Поинтересуйся, это интересно :)А ты поинтересуйся, что происходит с OUTER JOIN-ом, если необязательную сторону (в данном случае поле из таблицы b) проверять на равенство с константой.
...
Рейтинг: 0 / 0
05.10.2015, 07:29:38
    #39068057
exists,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
miksoftexists,Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ?
Поинтересуйся, это интересно :)А ты поинтересуйся, что происходит с OUTER JOIN-ом, если необязательную сторону (в данном случае поле из таблицы b) проверять на равенство с константой.если в where - то он становится inner. Но тут НЕ where !!
...
Рейтинг: 0 / 0
05.10.2015, 07:42:37
    #39068060
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице
exists,если в where - то он становится inner. Но тут НЕ where !!Да, тут моя промашка. Я на автомате посчитал что куча условий - это WHERE.

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


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