[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление строк
vital
Ну.. вобщем 3 таблицы, связаны релейшеном.
Вот такой вот запрос, просто ячто бы показать какие таблицы и какие поля.
SELECT relationExClassification.classificationId
FROM relationExClassification, classification, trainingtype
WHERE classification.trainingTypeId = trainingtype.id
AND trainingtype.id =1

Собственно надо удалить rainingtype.id, для этого надо удалить все relationExClassification.classificationId и classification.trainingTypeId, где
classification.trainingTypeId = trainingtype.id, relationExClassification.classificationId=classification.trainingTypeId
Вот как-то так.. сабж.
Как бы это сделать одним\двумя запросом, а не 3мя?



Спустя 11 минут, 31 секунда (6.12.2010 - 17:52) sergeiss написал(а):
Можешь, например, сделать триггер на удаление в одной из таблиц. Которая является ключевой. Тогда, при удалении любой записи, будут удалены связанные с ней записи в других таблицах, те из них, что ты укажешь.

Спустя 50 минут, 10 секунд (6.12.2010 - 18:43) vital написал(а):
Так, каскадное удаление отпадает, и триггер тоже нафиг. И вообще нафиг этот вопрос.
Другой вопрос. Надо сделать селект.
вот такой
SELECT relationExClassification.classificationId from classification,trainingType,relationExClassification where relationExClassification.classificationId=classification.classification AND classification.trainingTypeId=trainingType.id AND trainingType.id=1


только правильно, что бы он работал, с джойнами. Этот не работает, но тут понятно что я хочу)

Спустя 2 минуты, 7 секунд (6.12.2010 - 18:45) vital написал(а):
Вернее, даже не селект, а удалить, вот то, что получится.

Спустя 2 часа, 36 минут, 43 секунды (6.12.2010 - 21:21) SlavaFr написал(а):
ну так может просто про join почитать?

delete rec from relationExClassification as rec inner join classification as c on rec.classificationId=c.classification
inner join trainingType as t
on c.trainingTypeId=t.id where t.id=1

Спустя 5 минут, 1 секунда (6.12.2010 - 21:26) vital написал(а):
Цитата
ну так может просто про join почитать?

Да пробовал я много раз. Ну не доходит до меня хоть убейте как джойны работают.
*стыдно*

Спустя 1 час, 37 минут, 28 секунд (6.12.2010 - 23:04) SlavaFr написал(а):
ну так зачем стыдится то? надо просто спрашивать. Думаеш мы все знаем? Для того и крутимся на таких форумах чтоб самому чему небудь научится и другим подсказать.

Смотри, ты перечислил все таблицы в FROM которые должны участвовать в запросе. Потом написал в WEHRE
такое условие "classification.trainingTypeId = trainingtype.id" что означает, что таблицы classification и trainingtype соединяются по этим полям.
Именно это и есть условие соединения таблиц и по этому рекомендуется их вносить не в WHERE а посредством JOIN
... from tabliza1 inner join tabliza2 on tabliza1.pole_soedinenija=tabliza2.pole_soedinenija ....

Также ты написал "trainingtype.id =1" это не является условием соединения, а условием ограничения выбора и по этому должно находится в WHERE.

Takoe sql более длинное, но зато более понятное, так как хоршо видно по каким полям соединяются таблицы и по каким критерием селектируется результат объединенных таблиц


только пожалуйста задавай вопросы до тех пор, пока тебе не станет все понятным.

Спустя 1 час, 27 минут, 12 секунд (7.12.2010 - 00:31) vital написал(а):
LEFT, RIGHT, INNER,OUTER. В чем различие?
ВЕрнее, с первыми двумя понятнг по названию, а вот вторые..
пс.
Твой запрос немого переделать пришлось(порядок джойов изменил, т.к. в таком варианте возращался пустой рез-т. Почему порядок влияет?).

Спустя 9 часов, 5 минут, 20 секунд (7.12.2010 - 09:36) linker написал(а):
Вторые пересечение и наоборот. INNER выбирает только то, что строго находится в таблице FROM и таблице INNER JOIN. OUTER собственно наоборот.

Например, у тебя есть стелажи с книгами. Стелаж может иметь книги, а может быть пустым. Так вот, INNER JOIN выберете только те стелажи которые строго не пустые, а OUTER выберет только пустые стелажи.

Спустя 2 часа, 38 минут, 6 секунд (7.12.2010 - 12:15) vital написал(а):
о, спасибо.

Спустя 14 минут, 38 секунд (7.12.2010 - 12:29) SlavaFr написал(а):

# создаем две таблицы чтоб понять разницу между JOIN
create table
table1(
t1_pole int(3)
);

create table table2(
t2_pole int(3)
);


# запалняем таблицы значениями для теста
insert into table1 values(1),(3);
insert into table2 values(1),(2);

# проверяем что вышло в первой таблице
select * from table1;
# t1_pole
# 1
# 3


# проверяем что вышло во второй таблице
select * from table2;
# t2_pole
# 1
# 2
#

# INNER JOIN соединяет таблицы только по тем условиям которые
# указаны в ON и только тогда, когда условие дает положительный результат.
# в ниже указаном запросе условием соединения таблиц является простое сравнение в котором пля ti_pole и t2_pole равны.
# в нашем конкретном случае в обоих таблицах совподает только значение равное 1
select t1_pole,t2_pole
from table1 INNER JOIN table2 ON table1.t1_pole=table2.t2_pole;
# t1_pole t2_pole
# 1 1

# точно такого же результата можно добится также и таким образом как это уже делал ты.
# но это не красивый способ, так как при сложных запросах
# тяжело различить условия соединения таблиц от условий ограничения результата.
select t1_pole,t2_pole
from table1, table2 WHERE table1.t1_pole=table2.t2_pole;
#

# LEFT JOIN
# соединяет тавлицы таким образом, что в любом случае
# будут перечисленны все поля первой таблицы с лева и доплнительно все поля соответствующие условию соединения (JOIN) с права.
# там, где в правой таблице нет значения которое совпадало бы
# с условием соединения в левой таблице будет заполненно NULL

select
t1_pole,t2_pole from table1 LEFT JOIN table2 ON table1.t1_pole=table2.t2_pole;
# t1_pole t2_pole
# 1 1
# 3 null

# как видно этот селект выбрал все результаты левой таблицы 1 и 3
# и соответствующее условию значение из правой таблицы
# Так как в правой таблице нет не какого значения которое бы подходило для соединения к значению 3 из левой таблицы,
# то запрос заполнил правое поле ничем т.е null

# Когда это интерессно?
# Пример: У тебя есть таблица с Категориями Товара и есть таблица с Товаром
# предположим, что у тебя есть Категории у которых нет еще Товара,
# но тебе надо показать все Категории(с лева) и пренадлежащии им Торары (с права).
# Обычным INNER JOIN тебе не добится такого результата, так как он
# обрежит все значения с правой и левой таблицы которые не соответствуют условию.
# LEFT JOIN перечислит все категории даже если к ним нет не какого тавара.
# подставив вместо недостающих Товаров NULL
#


# RIGHT JOIN
# Такой же принцип как и в LEFT JOIN, только в зеркальном отображении :)
# T.e. показывает все значения правой таблицы и пресоединяет к ним
# все значения левой таблицы, которые соответствуют условию соединения.
# Там где нет подходящих значений в левой таблице,
# которые соответствуют условию соединения из правой таблицы, стоит NULL

select
t1_pole,t2_pole from table1 RIGHT JOIN table2 on table1.t1_pole=table2.t2_pole;
# t1_pole t2_pole
# 1 1
# null 2

#


# менее важно:

# OUTER JOIN
# не когда не встричал , но встречал LFFT OUTER JOIN и RIGHT OUTER JOIN
# которые собственно и являются обычными LEFT и RIGHT джойнами.

# также есть FULL OUTER JOIN который не поддерживается в mysql
# и является LEFT и RIGHT JOIN одновремменно.
#


# CROSS JOIN
# работает в mysql также, как и INNER JOIN хотя по настоящему имеет другое предназначение :)
# CROSS JOIN подставляет для каждого значения левой таблицы все значения правой таблицы и наоборот. т.е.
# такой join можно зделать просто таким образом:
select t1_pole,t2_pole from table1, table2 ;
# t1_pole t2_pole
# 1 1
# 3 1
# 1 2
# 3 2


#

# стераем таблицы
drop tables table1,table2;

Прошу учесть, что возможны ошибки.

Спустя 4 минуты, 8 секунд (7.12.2010 - 12:33) vital написал(а):
ооо! Шикарно. Это можно скопировать на другой ресурс? Спасибо, оргромное.


_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.