Как я могу вернуть 1 строку из подзапроса в операторе выбора, если подзапрос имеет более 1 результата? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть этот запрос:

select a.*, b.*, (select c.* from tableC c where c.id_tableA = a.id) from tableA a inner join tableB b on a.id = b.id_tableA where b.id_user = 50;

Подзапрос (который является tableC) возвращает мне более 1 строки, как и ожидалось. Как я могу вернуть только 1 строку из таблицы C, чтобы она могла совпадать с остальной частью запроса?

Пока я пробовал это:

(select c.* from tableC c where c.id_tableA = a.id limit 1) 

Это не сработало, как сказал mysql:

«Операнд должен содержать 1 столбец (столбцы)»

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

если идентификатор столбца из таблицы C является первичным ключом, то у него не должно быть проблем но если нет, попробуйте добавить еще одно условие, которое отфильтрует результаты вашего подзапроса, например,

например вот начальная дата:

SELECT a.column_1, b.column_2, 
        (SELECT column_3 FROM tableC  
        WHERE (id = a.id 
        AND (start_date = (SELECT MAX(b.start_date) 
             from tableC as c
             where a.id = c.id ))) AS column_3
FROM tableA as a INNER JOIN
     tableB as b ON b.id = a.id
WHERE b.id_user = 50;
0 голосов
/ 03 мая 2018

Вы смешиваете две вещи. Скалярный подзапрос в списке SELECT должен возвращать только одно значение (как строку, так и столбец). Использование LIMIT 1 даст вам одну строку, но все равно много столбцов. Таким образом, вы можете указать имя столбца:

select a.*, b.*,
  (select c.col_name from tableC c where c.id_tableA = a.id order by .. limit 1) 
from tableA a 
inner join tableB b on a.id = b.id_tableA 
where b.id_user = 50;

или используйте обычный JOIN:

select a.*, b.*, c.*
from tableA a
inner join tableB b 
  on a.id = b.id_tableA 
left join tableC c
  on c.id_tableA = a.id
where b.id_user = 50;
...