Как JOIN-ом подключить только одну запись подчинённой таблицы?
Даны две таблицы - клиенты и телефоны. Связаны один-ко-многим. Есть ли возможность вывести запросом список клиентов, выбирая каждому клиенту только один телефон (игнорируя остальные его телефоны)?
clients
id
name
phones
id
client_id
phone
Ответы (3 шт):
Как я понимаю что-то вот такое нужно:
SELECT t.phone, cl.client FROM telephone t LEFT JOIN clients cl ON t.id = cl.rid WHERE t.phone = 'Номер телефона'
P.s. t.id = cl.rid Это то, что соединяет эти две таблицы
UPD
Ну вот есть клиент Bob. У него два телефона: 02 и 03. И есть клиент Peter. У него 04 и 05. Нужен список: Bob 02, Peter 04
SELECT t.phone, cl.name FROM telephone t LEFT JOIN clients cl ON t.id = cl.rid WHERE t.phone in (02, 04)
Результат:
cl.name | t.phone
Bob | 02
Piter | 04
SELECT t1.name, ANY_VALUE(t2.phone) phone
FROM clients t1
JOIN phones t2 ON t1.id = t2.client_id
GROUP BY t1.name
Вам не нужно использовать JOIN, так как как раз хотите избавиться от того, ради чего придуман JOIN. Вам нужно добавить к имеющейся таблице одну, ЛЮБУЮ, подходящую запись из второй таблицы. Так и делайте это в лоб. Вот полностью рабочий код для вас
-- Создаем пример
drop table if exists clients;
create temporary table clients
(
id int,
name varchar
);
insert into clients (id, name)
values (1, 'Bob'),
(2, 'Peter'),
(3, 'Sanya'),
(4, 'Dima'),
(5, 'Petya');
drop table if exists phones1;
create temporary table phones1
(
client_id int,
phone varchar
);
insert into phones1 (client_id, phone)
values (1, '01'),
(1, '02'),
(1, '03'),
(2, '04'),
(2, '05');
-- Собственно само приклеивание любого, первого попавшегося = (limit 1) подходящего значения из второй таблицы.
select *, (select phone from phones1 where clients.id = phones1.client_id limit 1)
from clients;
commit;
Идея взята отсюда https://sqlinfo.ru/forum/viewtopic.php?pid=49153#p49153