Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > [MySql] Выбор из двух таблиц с сортировкой по дате


Автор: DeamonShan 14.10.2010, 11:35
Есть две таблицы: T1, T2

в каждой таблице имеется поле date типа timestamp. так в результате должно выводиться отсортированные строки по полю date

наприме, если

T!:

id date
1    1
2    3
3    4
4    18

T2:
id date
1    2
2    10
3    5

то результат должен быть: 

1) Т1.id=1
2) T2.id=1
3) T1.id=2
4) T1.id=3
5) T2.id=3
6) T2.id=2
7) T1.id=4



Помогите с запросом... В результат нужно включить значения из других таблиц. Есть еще две таблицы со статусами строк S1, S2 соответсвенно для таблицы T1 и T2. Т1.id=S1.id_t1, T2.id=S2_id_t2. Еще есть таблица, где хранится значение поля контрагент - C.

T1.cont_id=C.id, T2.cont_id=C.id

в результате для каждого результата должны иметь на выходе:

date, status, contragent_name

date - дата
status  - статус из таблиц S1, S2
contragent_name - название Контрагента из таблицы C.

Автор: Frees 14.10.2010, 12:14
Код

SELECT * FROM (
SELECT `id`
FROM T1
UNION ALL
SELECT `id`
FROM T2 )
ORDER BY 1

Автор: Zloxa 14.10.2010, 12:18
Цитата(DeamonShan @  14.10.2010,  11:35 Найти цитируемый пост)
то результат должен быть: 

Код

select concat(src,'.id =',id) from (
  select 'T1' src, t1.id,t1.date ftom t1
  union all
  select 'T2', t2.id,t2.date from t2
)
order by date


Добавлено @ 12:19
Frees, 
Цитата(Frees @  14.10.2010,  12:14 Найти цитируемый пост)
UNION

 smile 

Автор: Frees 14.10.2010, 12:27
Цитата(Zloxa @  14.10.2010,  15:18 Найти цитируемый пост)
Frees, Цитата(Frees @  14.10.2010,  12:14 )UNION  

не понял, к чему ты это? smile

Автор: Akina 14.10.2010, 12:31
Frees, в отличие от UNION ALL при простом UNION строки distinct-ятся.

Автор: Frees 14.10.2010, 13:04
да, точно не учел...
исправил пост выше

Автор: DeamonShan 14.10.2010, 13:04
а статус и название контрагента привязанного к данной строке7

Автор: Zloxa 14.10.2010, 13:12
Цитата(DeamonShan @  14.10.2010,  13:04 Найти цитируемый пост)
а статус и название контрагента привязанного к данной строке7 

Аппетиты приходят во время еды?
Название темы "Выбор из двух таблиц с сортировкой по дате"
Чесгря о том, что нужно соедениться с еще двумя таблицами, я прочитал только что. Чтение старта топика я прекратил сразу после того как обнаружил соответствие моего понимания вашей задачи и названия темы. smile

там простой join, как я понимаю.
Код

select s.date,coalesce(s1.status,s2.status) status, c.contragent_name 
from 
 (
   select 'T1' src, t1.id,t1.date,t1.cont_id ftom t1
   union all
   select 'T2', t2.id,t2.date,t2.cont_id from t2
 ) s 
left join s1 on s1.id_t1 = s.id and s.src = 'T1'
left join s2 on s2.id_t2 = s.id and s.src = 'T2'
left join c on s.cont_id = c.id
order by s.date


Автор: DeamonShan 14.10.2010, 13:19
ну в топике ведь написано все подробно. в названии не поместилось все это)

Код

SELECT concat( src, '.id =', id ) 
FROM (

SELECT 'recive_log' src, recive_log.id, recive_log.time from recive_log
UNION ALL 
SELECT 'check_log', check_log.id, check_log.time
FROM check_log)


делаю такой завпрос в пхпмайадмин, получаю ошибку:

Код

#1248 - Every derived table must have its own alias

Автор: Frees 14.10.2010, 13:25
http://www.mysql.ru/docs/man/UNION.html

Автор: Zloxa 14.10.2010, 13:26
Цитата(DeamonShan @  14.10.2010,  13:19 Найти цитируемый пост)
ftom 


Автор: Frees 14.10.2010, 13:27
Цитата(DeamonShan @  14.10.2010,  16:19 Найти цитируемый пост)
ftom

Может From ?

Добавлено через 2 минуты и 34 секунды
OFF
DeamonShan, советую тебе думать а не бездумно копировать..

Автор: DeamonShan 14.10.2010, 13:30
Zloxa, 
Frees, 

исправился... теперь возникла другая ошибка... отредактировал пост выше..

З 
Код

#1248 - Every derived table must have its own aliasЫ.

Автор: Zloxa 14.10.2010, 13:32
DeamonShan, присвойте алиас подзапросу.

Автор: DeamonShan 14.10.2010, 13:41
Извеняюсь за глупые вопросы конечно!

Код

SELECT concat( src, '.id =', id ) 
FROM (

SELECT 'recive_log'src, recive_log.id, recive_log.time
FROM recive_log
UNION ALL 
SELECT 'check_log', check_log.id, check_log.time
FROM check_log
) AS tabl
ORDER BY tabl.time
LIMIT 0 , 20


я так понимаю, теперь таблица `tabl` будет содержать поля из id, time или же она присвоит все поля двух таблиц? Последнее не логично конечно, но все же.

Добавлено через 2 минуты и 59 секунд
Zloxa, за джоин отдельное спасибо!
Akina, 
Frees, 

Спасибо ребята!!!

Автор: Zloxa 14.10.2010, 13:48
Цитата(DeamonShan @  14.10.2010,  13:41 Найти цитируемый пост)
теперь таблица `tabl` будет содержать поля из id, timе

да.
Только не "таблица",  а "набор записей [возвращенных подзапросом tab1]".

Автор: DeamonShan 14.10.2010, 13:53
Цитата(Frees @  14.10.2010,  13:27 Найти цитируемый пост)
OFF
DeamonShan, советую тебе думать а не бездумно копировать.. 


Мне предстоит этот пример применить в несколько иной задаче. Те вопросы, которые я спрашивал, они общие в моем случае и включают в себя непонятные моменты для меня. Конкретную задачу я буду решать уже подумав, просто хотел поскорее проверить  smile 

Все равно спасибо за замечание!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)