SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.03.2014 18:41:18

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Заполнение нового столбца выборочными данными из другой таблицы

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

Прошу помощи в составлении sql запроса для заполнения столбца.

Есть таблица CLIENTS (клиенты) и есть таблица ORDERS (заказы), связанные через поля ID и ClientID соотв. Каждая запись клиента связана с несколькими записями о его заказах. В таблице ORDERS есть помимо прочих поле OrderDate (дата заказа). В таблице CLIENTS создал поле LastOrderDate.

Вопрос: как с помощью sql я могу заполнить весь столбец датами последнего заказа для каждого клиента?

Неактивен

 

#2 29.03.2014 19:33:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

insert into CLIENTS (OrderDate) select ..

как написать правильный select см http://sqlinfo.ru/articles/info/18.html

Неактивен

 

#3 29.03.2014 19:59:34

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

большое спасибо за наводку,
а можно ли вместо INSERT использовать SET?

update CLIENTS set LastOrderDate = select ..

Неактивен

 

#4 29.03.2014 20:14:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

да, вы правы. insert здесь не нужен
см синтаксис для update нескольких таблиц
http://dev.mysql.com/doc/refman/5.5/en/update.html

Неактивен

 

#5 29.03.2014 20:19:30

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

здорово, про update нескольких таблиц не знал.
Спасибо, пошел изучать.

Неактивен

 

#6 29.03.2014 20:25:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

там есть примеры, но в вашем случае одной из таблиц будет подзапрос возвращающий дату последнего заказа для каждого клиента.

Неактивен

 

#7 30.03.2014 16:19:19

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

прошу прощения, но мытарства мои не прекратились, может подскажете?

1) создал селект из таблицы "ЗАКАЗЫ"

SELECT ClientID, max(OrderDate) as MaxDate FROM Orders GROUP BY ClientID

не нарадуюсь на него, получилась таблица из 2-х столбцов : ClientID, MaxDate. Напротив каждого клиента дата его последнего заказа. Отлично.

2) сделал объединение новой таблицы-селекта с таблицей CLIENTS

CLIENTS cl INNER JOIN (SELECT ClientID, max(OrderDate) AS MaxDate FROM Orders GROUP BY ClientID) s ON s.ClientID=cl.ID

и здесь победа. SELECT * показал именно то, что нужно

SELECT * FROM (CLIENTS cl INNER JOIN (SELECT ClientID, max(OrderDate) AS MaxDate FROM Orders GROUP BY ClientID) s ON s.ClientID=cl.ID)

а именно, остались записи лишь с клиентами, у которых есть хотя бы один заказ, и напротив каждого в поле MaxDate была дата его последнего заказа. Казалось бы, вот оно счастье, но

3) конструкция
UPDATE
(
SELECT * FROM
Clients cl INNER JOIN (SELECT ClientID, max(OrderDate) AS MaxDate FROM Orders GROUP BY ClientID) s ON s.ClientID=cl.ID

)
tt
SET tt.LastOrderDate=tt.MaxDate


не изменяет ничего, поле  LastOrderDate таблицы Clients как было пустым, так и осталось sad в чем мой косяк?

Отредактированно Lavr (30.03.2014 16:25:32)

Неактивен

 

#8 30.03.2014 18:10:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

потому что вы меняете поле LastOrderDate таблицы tt, а не Clients

UPDATE Clients , (SELECT ClientID, max(OrderDate) as MaxDate FROM Orders GROUP BY ClientID) tt SET Clients.LastOrderDate=tt.MaxDate WHERE Clients.ID=tt.ClientID;

Неактивен

 

#9 30.03.2014 20:40:15

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

vasya написал:

потому что вы меняете поле LastOrderDate таблицы tt, а не Clients

UPDATE Clients , (SELECT ClientID, max(OrderDate) as MaxDate FROM Orders GROUP BY ClientID) tt SET Clients.LastOrderDate=tt.MaxDate WHERE Clients.ID=tt.ClientID;

вот я дурак smile спасибо!
правда у меня выявился необычный глюк, почему то не работает подзапрос SELECT

UPDATE Clients , ТЕСТОВАЯ_ТАБЛИЦА tt SET Clients.LastOrderDate=null;

работает, а вот вроде аналогичное

UPDATE Clients , (SELECT * FROM ТЕСТОВАЯ_ТАБЛИЦА) tt SET Clients.LastOrderDate=null;

уже нет - ничего не меняется.
хотя, подозреваю, это уже не вопрос MySQL...

Неактивен

 

#10 30.03.2014 20:46:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

Оба запроса делают одно и тоже. Логично, что после выполнения первого вы не увидите изменений выполнив второй.
Замените во втором запросе null на какое-нибудь значение.

Неактивен

 

#11 30.03.2014 21:08:23

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

vasya написал:

Оба запроса делают одно и тоже.

спасибо. Значит я все делал правильно.

vasya написал:

Замените во втором запросе null на какое-нибудь значение.

делал, первым запросом обнулял =null, вторым ставил произвольную дату ='01.01.2001' и наоборот
первый способ работает, второй - нет
в общем проблема аппаратная, скорее связана с тем, что я делаю запрос в триггере при открытии БД
большое спасибо за консультации по SQL и оценку итогов!

Отредактированно Lavr (30.03.2014 21:11:13)

Неактивен

 

#12 30.03.2014 21:25:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

А можете привести полный текст триггера? Любопытно, такого поведения быть не должно.

Неактивен

 

#13 30.03.2014 22:03:30

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

vasya написал:

А можете привести полный текст триггера? Любопытно, такого поведения быть не должно.

эээ, ну это затруднительно.
Я новичок sad, и недавно начал пользоваться оболочкой "Учет клиентов".
Там есть опции - добавить триггер:
http://www.picshare.ru/uploads/140330/Rcm204zV7J.png

хотя знал бы, что будет "так просто" с этой "упрощенной" оболочкой, не заморачивался бы и сразу вел базу в MS Access по науке, медленно, зато надежно.

Отредактированно Lavr (30.03.2014 22:04:28)

Неактивен

 

#14 30.03.2014 22:15:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Заполнение нового столбца выборочными данными из другой таблицы

так у вас база не MySQL?
тогда возможно это и нормальное поведение, там отличаются диалекты SQL

Неактивен

 

#15 30.03.2014 22:23:37

Lavr
Участник
Зарегистрирован: 29.03.2014
Сообщений: 9

Re: Заполнение нового столбца выборочными данными из другой таблицы

Большое спасибо вам, Vasya!
Без вас бы погряз в страхах и неуверенности.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson