Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Запрос из нескольких таблиц по условию  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Здравствуйте.
У меня есть две таблицы. В них содержатся следующие данные

vdubl (t1):
NUM: 1 ADR: Адрес Date: Дата


contracts (t2):
NUM: 1 address: Адрес condt: Дата cform: Вид найма

NUM: 1 address: Адрес condt: Другая Дата cform: Другой вид найма


Мне нужно выбрать все строки таблицы t1, при этом добавить к каждой строке колонку cform из таблицы t2, но мне нужен самый новый cform по дате condt...

Я пробовал JOIN:
SELECT t2.cform,t1.ADR,t1.NUM,t1.Date FROM vdubl AS t1 JOIN contracts AS t2 ON t1.NUM=t2.NUM;
Но джоин при таком запросе дублирует строку из таблицы t1 два раза, со всеми видами найма. Возможно, тут надо как то добавить условие, но у меня не получилось.

Пробовал Subquery:
SELECT ADR,NUM,DATE,(select cform from contracts where contracts.NUM=vdubl.NUM order by condt ASC limit 1) as 'Вид найма' from vdubl;
Но такой запрос обрабатывается больше 10 минут...

Подскажите, как мне правильно составить запрос чтоб получить нужные данные?
Заранее благодарен.
6 фев 20, 13:50    [22074677]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
1) Укажите версию MySQL.

2) Создайте fiddle. Или хотя бы вместо хренпоймикакого формата описания выложите рабочие CREATE TABLE + INSERT INTO. А также дайте эталонный ответ для ИМЕННО ТАКИХ данных.
6 фев 20, 14:09    [22074715]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Сиволапый
как мне правильно составить запрос чтоб получить нужные данные?

Для любой версии (схематично)

SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.num=t2.num
JOIN ( SELECT t3.num, MAX(t3.date) date
       FROM tablet t3
       GROUP BY t3.num ) t4 ON (t2.num, t2.date) = (t4.num, t4.date)
6 фев 20, 14:12    [22074725]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Таблица vdubl:
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| PRIM  | int(10) unsigned | NO   |     | 0       |       |
| NUM   | int(11)          | NO   |     | NULL    |       |
| ADR   | varchar(200)     | YES  |     | NULL    |       |
| NM    | varchar(50)      | YES  |     | NULL    |       |
| ETJ   | varchar(50)      | YES  |     | NULL    |       |
| DC    | int(11)          | YES  |     | NULL    |       |
| DV    | datetime         | YES  |     | NULL    |       |
| INUM  | varchar(50)      | YES  |     | NULL    |       |
| BL    | double(12,2)     | YES  |     | NULL    |       |
| PL    | float(5,2)       | YES  |     | NULL    |       |
| SV    | varchar(200)     | YES  |     | NULL    |       |
| REGN  | varchar(50)      | YES  |     | NULL    |       |
| REGD  | datetime         | YES  |     | NULL    |       |
| NSV   | varchar(50)      | YES  |     | NULL    |       |
| OSP   | varchar(200)     | YES  |     | NULL    |       |
| OSZ   | varchar(200)     | YES  |     | NULL    |       |
| UL    | varchar(100)     | YES  |     | NULL    |       |
| VP    | varchar(50)      | YES  |     | NULL    |       |
| DZ    | varchar(200)     | YES  |     | NULL    |       |
| COMM  | varchar(200)     | YES  |     | NULL    |       |
| ROOMS | smallint(6)      | YES  |     | NULL    |       |
| JPL   | float(5,2)       | YES  |     | NULL    |       |
| MUN   | tinyint(1)       | NO   |     | 0       |       |
+-------+------------------+------+-----+---------+-------+


Таблица contracts:
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| pk      | int(11)      | NO   | PRI | NULL    | auto_increment |
| sheet   | int(2)       | YES  |     | NULL    |                |
| row     | int(2)       | YES  |     | NULL    |                |
| cnum    | varchar(200) | YES  |     | NULL    |                |
| cform   | varchar(100) | YES  |     | NULL    |                |
| condt   | datetime     | YES  |     | NULL    |                |
| fam     | mediumtext   | YES  |     | NULL    |                |
| famcom  | int(10)      | YES  |     | NULL    |                |
| osz     | varchar(200) | YES  |     | NULL    |                |
| address | varchar(200) | YES  | MUL | NULL    |                |
| room    | smallint(6)  | YES  |     | NULL    |                |
| s       | varchar(100) | YES  |     | NULL    |                |
| js      | varchar(100) | YES  |     | NULL    |                |
| note    | varchar(200) | YES  |     | NULL    |                |
| phone   | varchar(100) | YES  |     | NULL    |                |
| trmd    | varchar(100) | YES  |     | NULL    |                |
| NUM     | int(11)      | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+


Это две разные, независимые таблицы. Я хочу выбрать все колонки из таблицы vdubl, после выбрать колонку cform из таблицы contracts, по полю NUM. Т.е. NUM одинаковый в этих таблицах для записей с одинаковым адресом. Но дело в том, что в таблице contracts записей с нужным NUM может быть несколько, они отличны по дате.

INSERT INTO независимый для каждой таблицы, таблицы были созданы 12 лет назад и с тех пор наполняются. Я руками добавил колонку NUM во вторую таблицу и заполнил её C# скриптом, сравнивая поле address и ADR (они совпадают частично, но с помощью like можно найти соответствие)...

Версия MySQL - mysqld Ver 5.0.51a for Win32 on ia32 (Source distribution)
6 фев 20, 14:48    [22074781]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Akina
выложите рабочие CREATE TABLE + INSERT INTO.
А не DESCRIBE.
Сиволапый
mysqld Ver 5.0.51a
Тогда ответ я собственно уже дал - более современные средства на этой версии недоступны.
6 фев 20, 15:40    [22074874]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Muxaul990
Member

Откуда: Киров
Сообщений: 25
SELECT * FROM vdubl
RIGHT JOIN Contracts ON vdubl.num=Contracts.num;

Вместо символа * указываешь столбцы, которые хочешь вывести в запросе. В итоге, ты получишь записи из таблиц vdubl и Contracts, которые как бы связаны по полю num, а также все записи из таблицы Contracts, не связанные с таблицей vdubl.

Для справки : INNER JOIN - пересечение записей 2-х таблиц;
LEFT JOIN - все записи левой таблицы + пересечение записей 2-х таблиц;
RIGHT JOIN - все записи правой таблицы + пересечение записей 2-х таблиц.
6 фев 20, 15:47    [22074885]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Muxaul990, как это поможет выбрать ОДНУ самую новую запись из нескольких связанных?
6 фев 20, 16:54    [22074957]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Сиволапый
Member

Откуда:
Сообщений: 15
Akina, Спасибо. Ваш схематичный пример помог мне.

Этот запрос выдает мне то, что нужно:

SELECT t2.cform,t1.ADR AS 'Address',
t1.DV AS 'Date',
t1.NUM AS 'Number'
FROM vdubl AS t1
JOIN contracts AS t2
ON t1.NUM=t2.NUM
JOIN (Select t3.NUM, MAX(t3.condt) as mdate
from contracts t3 group by t3.num) t4 ON (t2.NUM, t2.condt) = (t4.NUM, t4.mdate)"

Но есть ещё один вопрос, в таблице vdubl 9000 строк, по запросу выше мне выдается только 6 тысяч строк, т.е. это те строки, в которых t1.NUM=t2.NUM. Но дело в том, что не все NUM в vdubl имеют пару в contracts. Как мне отобразить все 9 тысяч строк, т.е. строки у которых нет пары в contracts получили значение NULL в колонке t2.cform?
7 фев 20, 06:38    [22075266]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц по условию  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1455
Сиволапый
в таблице vdubl 9000 строк, по запросу выше мне выдается только 6 тысяч строк, т.е. это те строки, в которых t1.NUM=t2.NUM. Но дело в том, что не все NUM в vdubl имеют пару в contracts. Как мне отобразить все 9 тысяч строк, т.е. строки у которых нет пары в contracts получили значение NULL в колонке t2.cform?
Почитайте про внешние соединения ([LEFT | RIGHT | FULL] [OUTER] JOIN)
7 фев 20, 07:19    [22075269]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить