SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 19.05.2008 00:43:27

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Помогите с запросом пожалуйста

оставил только существенные поля, чтобы было проще.
Такимо образом, имеем две таблицы:

CREATE TABLE draft(
  Num int NOT NULL,
  Pref сhar(1) NOT NULL
);

CREATE TABLE final(
  Num int NOT NULL PRIMARY KEY
);


каждая строка в таблице draft уникальна по Num и Pref вместе взятым.
поле Pref может содержать один из трех символов: 'P', 'N', 'A'
хочу перенести данные из draft в final со следующим условием:

сперва все числа Num для которых Pref='P',а во вторую очередь числа Num для которых Pref='N' OR Pref='A', но они должны быть не равны ранее выбранным по Pref='P'

Обратите внимение что первая таблица без ключей, в во втрой ключ присутствует.
Я вижу запрос чем то похожий на:
INSERT INTO final SELECT Num FROM draft WHERE Pref='P';

Можно ли сделать это одним запросом ? Если несколькими, я тоже не обижусь.
Спасибо.

Отредактированно Golova (19.05.2008 00:45:54)

Неактивен

 

#2 19.05.2008 01:09:42

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Помогите с запросом пожалуйста

Приходит на ум такое:


INSERT INTO final
SELECT num
FROM draft
GROUP BY num
ORDER BY MAX(IF(pref = 'P', 1, 0)) DESC

-- вместо MAX можно SUM или любую другую функцию, которая покажет,
-- что для данного num есть значение pref = 'P'
 


Т.к. у Вас на второй таблице PRIMARY KEY, есть менее замысловатый вариант:

INSERT IGNORE INTO final SELECT num FROM draft ORDER BY IF(pref = 'P', 1, 0) DESC


Такое просто прогонит всю таблицу draft через final - сначала те num, у которых есть pref = 'P'; те же num с остальными pref из-за модификатора IGNORE просто пройдут мимо таблицы.

Неактивен

 

#3 19.05.2008 01:11:47

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Помогите с запросом пожалуйста


INSERT INTO final SELECT Num FROM draft WHERE Pref='P';
INSERT INTO final SELECT Num FROM draft WHERE Pref IN ('A','N') ON DUPLICATE KEY UPDATE final.Num=final.Num;
 

ON DUPLICATE KEY спасет от повторных значений уникального первичного ключа

Неактивен

 

#4 19.05.2008 01:13:13

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Помогите с запросом пожалуйста

Ну да, можно и так.

Неактивен

 

#5 19.05.2008 10:38:33

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: Помогите с запросом пожалуйста

ох спасибо большое!

Неактивен

 

Board footer

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