powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос из нескольких таблиц по условию
9 сообщений из 9, страница 1 из 1
Запрос из нескольких таблиц по условию
    #39923386
Сиволапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
У меня есть две таблицы. В них содержатся следующие данные

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 минут...

Подскажите, как мне правильно составить запрос чтоб получить нужные данные?
Заранее благодарен.
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923413
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Укажите версию MySQL.

2) Создайте fiddle. Или хотя бы вместо хренпоймикакого формата описания выложите рабочие CREATE TABLE + INSERT INTO. А также дайте эталонный ответ для ИМЕННО ТАКИХ данных.
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923422
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сиволапый
как мне правильно составить запрос чтоб получить нужные данные?

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

Код: sql
1.
2.
3.
4.
5.
6.
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)
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923450
Сиволапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица vdubl:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
+-------+------------------+------+-----+---------+-------+
| 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:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
+---------+--------------+------+-----+---------+----------------+
| 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)
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923495
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
выложите рабочие CREATE TABLE + INSERT INTO.
А не DESCRIBE.
Сиволапый
mysqld Ver 5.0.51a
Тогда ответ я собственно уже дал - более современные средства на этой версии недоступны.
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923504
Muxaul990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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-х таблиц.
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923554
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Muxaul990 , как это поможет выбрать ОДНУ самую новую запись из нескольких связанных?
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923730
Сиволапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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?
...
Рейтинг: 0 / 0
Запрос из нескольких таблиц по условию
    #39923733
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сиволапый
в таблице vdubl 9000 строк, по запросу выше мне выдается только 6 тысяч строк, т.е. это те строки, в которых t1.NUM=t2.NUM. Но дело в том, что не все NUM в vdubl имеют пару в contracts. Как мне отобразить все 9 тысяч строк, т.е. строки у которых нет пары в contracts получили значение NULL в колонке t2.cform?
Почитайте про внешние соединения ([LEFT | RIGHT | FULL] [OUTER] JOIN)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос из нескольких таблиц по условию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]