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

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

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

Вы не зашли.

#1 30.11.2011 14:54:39

farm
Участник
Зарегистрирован: 30.11.2011
Сообщений: 4

Выбор уникальных строк из 5-и таблиц

Доброго дня.
Прошу помощи уважаемых форумчан.

Есть 5 одинаковых таблиц t1,t2,t3,t4,t5

CREATE TABLE `t1` (
  `IDPOS` int(12) DEFAULT NULL,
  `NAME` varchar(255) DEFAULT NULL,
  `NAME_FIRMA` varchar(255) DEFAULT NULL,
  `CENAP` decimal(12,2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


нужен запрос который выберет все строки из t1 и последовательно добавит в результат все строки из t2 которых нет в t1, все строки из t3 которых нет в выборке из t1 и t2,  все строки из t4 которых нет в выборке из t1, t2 и t3, все строки из t5 которых нет в выборке из t1, t2 и t3, t4. То есть только строки с уникальным IDPOS начиная с t1.  Выборка по полю IDPOS. Если в одной таблице есть строки с одинаковым IDPOS, то нужно выбрать ту где CENAP меньше.

Предположим:
в t1.idpos значения 1,2,3
в t2.idpos значения 3,4,5
в t3.idpos значения 5,4,7
в t4.idpos значения 6,5,8
в t5.idpos значения 9,8,3

в результате должны получить в колонке idpos:
1 - из t1
2 - из t1
3 - из t1
4 - из t2
5 - из t2
7 - из t3
6 - из t4
8 - из t4
9 - из t5

Заранее спасибо.

Неактивен

 

#2 30.11.2011 14:57:01

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выбор уникальных строк из 5-и таблиц

Используйте union


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 30.11.2011 15:02:10

farm
Участник
Зарегистрирован: 30.11.2011
Сообщений: 4

Re: Выбор уникальных строк из 5-и таблиц

Целый день бьюсь с этим, осилил вот так:

SELECT final.* FROM (
 SELECT *
 FROM (
  SELECT * FROM t1 GROUP BY IDPOS
  UNION
  SELECT t2.* FROM t2 LEFT JOIN t1 ON t2.idpos = t1.IDPOS WHERE t1.IDPOS is null GROUP BY IDPOS
  UNION
  SELECT t3.* FROM t3 LEFT JOIN t2 ON t3.idpos = t2.IDPOS WHERE t2.IDPOS is null GROUP BY IDPOS
  UNION
  SELECT t4.* FROM t4 LEFT JOIN t3 ON t4.idpos = t3.IDPOS WHERE t3.IDPOS is null GROUP BY IDPOS
  UNION
  SELECT t5.* FROM t5 LEFT JOIN t4 ON t5.idpos = t4.IDPOS WHERE t4.IDPOS is null GROUP BY IDPOS
  ORDER BY CENAP DESC
 )  AS grouped
 WHERE TRUE
 GROUP BY IDPOS
 ORDER BY CENAP DESC
) AS final LEFT JOIN t1 ON final.IDPOS = t1.IDPOS
ORDER BY final.IDPOS ASC


но все равно результат не верный. Подскажите куда копать.

Отредактированно farm (30.11.2011 15:03:15)

Неактивен

 

#4 30.11.2011 16:15:45

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выбор уникальных строк из 5-и таблиц

select IDPOS,min(CENAP) from t1
union
select IDPOS,min(CENAP) from t2
union
select IDPOS,min(CENAP) from t3
union
select IDPOS,min(CENAP) from t4
union
select IDPOS,min(CENAP) from t5
group by IDPOS;


подойдёт?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 30.11.2011 20:03:16

farm
Участник
Зарегистрирован: 30.11.2011
Сообщений: 4

Re: Выбор уникальных строк из 5-и таблиц

Спасибо всем.
Решил вот так:

SELECT DISTINCT z.* from
  (select DISTINCT * from torg_1 group by cenap
    union SELECT DISTINCT * from torg_2 group by cenap
            union SELECT DISTINCT * from torg_3 group by cenap
                    union SELECT DISTINCT * from torg_4 group by cenap
                            union SELECT DISTINCT * from torg_5 group by cenap
)z  group by idpos

Неактивен

 

#6 30.11.2011 20:04:44

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выбор уникальных строк из 5-и таблиц

А как Вы учитываете условие

Выборка по полю IDPOS. Если в одной таблице есть строки с одинаковым IDPOS, то нужно выбрать ту где CENAP меньше.

в своём решении?

Отредактированно deadka (30.11.2011 20:05:01)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 01.12.2011 09:37:35

farm
Участник
Зарегистрирован: 30.11.2011
Сообщений: 4

Re: Выбор уникальных строк из 5-и таблиц

Если я правильно понял мануал, то:
group by cenap - по умолчанию группирует наименьшее значение первым
union - без all  - объединение не повторяющихся строк начиная с первой (где первая уже с наименьшей cenap)

Неактивен

 

Board footer

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