Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка существования разных id в нескольких табл 
V
    Опции темы
maxipub
Дата 29.5.2017, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Здравствуйте!

Нужно проверить факт существования всех записей с указанными разными id в разных таблицах. Одним запросом делаю это так:

Код
SELECT 1 FROM table_one AS t1 
INNER JOIN table_two AS t2 ON t2.id_two=$id2 
INNER JOIN table_three AS t3 ON t3.id_three=$id3 
WHERE t1.id_one=$id1


Вопрос в том, насколько это корректно? Возможно есть более простой вариант, без джойна?
PM MAIL   Вверх
Akina
Дата 29.5.2017, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(maxipub @  29.5.2017,  17:48 Найти цитируемый пост)
Нужно проверить факт существования всех записей с указанными разными id в разных таблицах. 

Вот просто проверить, и всё? если  нет -  то пофиг, сколько есть и сколько нет?

Цитата(maxipub @  29.5.2017,  17:48 Найти цитируемый пост)
насколько это корректно?

Не очень корректно - хотя зависит от точной формулировки задачи, включая ответ на предыдущий вопрос.

Цитата(maxipub @  29.5.2017,  17:48 Найти цитируемый пост)
Возможно есть более простой вариант, без джойна?

К сожалению, кто-то не сказал, являются ли требуемые "разные id" значениями уникального поля (как вариант - первичного индекса). Будем считать, что нет - это более общий случай.
Также не сказано, для каждой таблицы задано только одно значение (впрочем. на этом настаивает запрос) или список. Будем считать, что список - по той же причине.

Выполняем запрос
Код

SELECT COUNT(summ.id)
FROM (
    SELECT COUNT(/* DISTINCT */ id) 
    FROM table1 
    WHERE id /*= $id1*/ IN ($ids1)
UNION ALL
    SELECT COUNT(/* DISTINCT */ id) 
    FROM table2
    WHERE id /*= $id2*/ IN ($ids2)
UNION ALL
    SELECT COUNT(/* DISTINCT */ id) 
    FROM table3
    WHERE id /*= $id3*/ IN ($ids3)
) summ

и проверяем, что возвращённое значение равно суммарному количеству значений во всех списках для проверки.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 30.5.2017, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  29.5.2017,  21:48 Найти цитируемый пост)
Вот просто проверить, и всё? если  нет -  то пофиг, сколько есть и сколько нет?

Да.

Цитата(Akina @  29.5.2017,  21:48 Найти цитируемый пост)
К сожалению, кто-то не сказал, являются ли требуемые "разные id" значениями уникального поля (как вариант - первичного индекса).

id уникальны в пределах своей таблицы. Между собой они ни как не связаны.

Цитата(Akina @  29.5.2017,  21:48 Найти цитируемый пост)
Также не сказано, для каждой таблицы задано только одно значение (впрочем. на этом настаивает запрос) или список.

По одному значению для таблицы.
PM MAIL   Вверх
Akina
Дата 30.5.2017, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(maxipub @  30.5.2017,  11:56 Найти цитируемый пост)
id уникальны в пределах своей таблицы. Между собой они ни как не связаны.

Цитата(maxipub @  30.5.2017,  11:56 Найти цитируемый пост)
По одному значению для таблицы. 

Ну запрос-то дан. Убрать DISTINCT-ы, убрать IN, раскомментировать равенства - всё.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 30.5.2017, 12:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 1
Всего: 484



Существуют все 3 записи:
Код

SELECT 1 FROM table_one t1, table_two t2, table_three t3 WHERE t1.id_one=$id1 AND t2.id_two=$id2 AND t3.id_three=$id3;


Существует хотя бы одна из 3-х
Код

SELECT 1 FROM table_one t1 WHERE t1.id_one=$id1
UNION
SELECT 1 FROM table_two t2 WHERE t2.id_two=$id2 
UNION
SELECT 1 FROM table_three t3 WHERE t3.id_three=$id3

PM MAIL   Вверх
Zloxa
Дата 5.6.2017, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Akina, Snowy, зачем вы так сложно пишите?

Цитата(Snowy @  30.5.2017,  13:43 Найти цитируемый пост)
SELECT 1 FROM table_one t1 WHERE t1.id_one=$id1
UNION
SELECT 1 FROM table_two t2 WHERE t2.id_two=$id2 
UNION
SELECT 1 FROM table_three t3 WHERE t3.id_three=$id3

 smile
Это ведь то же что и :
Код

select distinct 1 from table_one where t1.id_one in ($id1, $id2, $id3)

Код

select distinct 1 from table_one where t1.id_one = $id1 or t1.id_one = $id2 or t1.id_one =$id3

?

Цитата(Akina @  29.5.2017,  22:48 Найти цитируемый пост)
SELECT COUNT(summ.id)
FROM (
    SELECT COUNT(/* DISTINCT */ id) 
    FROM table1 
    WHERE id /*= $id1*/ IN ($ids1)
UNION ALL
    SELECT COUNT(/* DISTINCT */ id) 
    FROM table2
    WHERE id /*= $id2*/ IN ($ids2)
UNION ALL
    SELECT COUNT(/* DISTINCT */ id) 
    FROM table3
    WHERE id /*= $id3*/ IN ($ids3)
) summ

 smile 

Это ведь то же что и :
Код

    SELECT COUNT(DISTINCT id) 
    FROM table3
    WHERE id in  ($id1, $id2, $id3)

?
либо
Код

    SELECT COUNT(DISTINCT id) 
    FROM table3
    WHERE id in  ($ids1) or id in ($ids2) or id in ($ids3)

?

Добавлено @ 14:46
Цитата(Snowy @  30.5.2017,  13:43 Найти цитируемый пост)
SELECT 1 FROM table_one t1, table_two t2, table_three t3 WHERE t1.id_one=$id1 AND t2.id_two=$id2 AND t3.id_three=$id3;

 smile 
Я почему-то так никогда не делал, приму на вооружение.

всегда делал сложнее, навроде 
Код

SELECT 1 FROM table_one t1 WHERE t1.id in ($id1, $id2, $id3) having count(/*distinct*/ t1.id) = 3


Это сообщение отредактировал(а) Zloxa - 5.6.2017, 14:53


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.6.2017, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(Zloxa @  5.6.2017,  15:38 Найти цитируемый пост)
Это ведь то же что и

У нас таблицы-то РАЗНЫЕ. Ищется в ТРЁХ таблицах по одному ID в каждой. А ты пишешь поиск трёх разных ID в одной и той же таблице...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.6.2017, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  5.6.2017,  16:36 Найти цитируемый пост)
У нас таблицы-то РАЗНЫЕ

Соррян. Попутал.
 smile  smile  smile


Это сообщение отредактировал(а) Zloxa - 5.6.2017, 15:37


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1349 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.