Вот такой вот запрос, просто ячто бы показать какие таблицы и какие поля.
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
Также ты написал "trainingtype.id =1" это не является условием соединения, а условием ограничения выбора и по этому должно находится в WHERE.
Takoe sql более длинное, но зато более понятное, так как хоршо видно по каким полям соединяются таблицы и по каким критерием селектируется результат объединенных таблиц
только пожалуйста задавай вопросы до тех пор, пока тебе не станет все понятным.
Смотри, ты перечислил все таблицы в 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 выберет только пустые стелажи.
Например, у тебя есть стелажи с книгами. Стелаж может иметь книги, а может быть пустым. Так вот, 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